Ajax POST-запрос для цикла, влияющего на данные POST во время второй итерации - PullRequest
0 голосов
/ 14 ноября 2018

Я отправляю запрос ajax внутри цикла for, вот как работает мой цикл:

let postDbData = async ($, ajaxUrl) =>{
  for( let page_num = 1; page_num > 0; page_num++ ){
    let imageData = []; //1. Define an empty Array
    await dbData($, ajaxUrl, page_num).then( i => imageData = i );
     //2. Calls dbData() which returns an array. Assign that that returned array to imageData
    console.log(imageData); 
    await $.post( ajaxUrl, { action: "insert_sync_data_db", imageData: imageData } ) 
     //3. Send imageData to server Using POST request, to save it into database
    if(imageData.length <= 0) page_num = 0; 
     // 4. if dbData() does'nt return an array or return an blank array, set page_num to 0 so we can get out from the loop
  }
}

dbData() возвращает уникальный массив в каждой итерации. Что я хочу сделать, так это: в каждой итерации заменять массив imageData новым массивом, но мой код не заменяет предыдущее содержимое, а помещает новые данные в imageData.

Проблема возникает во второй итерации. Массив imageData сохраняет значения предыдущей итерации (как если бы он игнорировал let imageData = [];). однако это невозможно.

Массив перестает сохранять предыдущие значения, когда я комментирую свой запрос Ajax POST . после удаления пост-запроса предыдущие значения моей переменной imgData сбрасываются в каждой итерации, а новые значения появляются в imgData (//await $.post( ajaxUrl, { action: "insert_sync_data_db", imageData: imageData } )) Я не знаю, почему этот запрос ajax портит мой массив.

Вот другие функции, от которых зависит эта функция.

dbData ()

let dbData = async ($, ajaxUrl, page_num) => {

    let data = [];

    await compareImagesToSync($, ajaxUrl, page_num).then( async i => {
        await getImageDetails(i).then( i => {
            i.data.data.forEach( i => {
                let temp = {};
                temp.id = i.id;
                temp.preview_url = i.assets.preview.url;
                temp.description = i.description;
                temp.keywords = i.keywords.join(", ");
                data.push(temp);
            } );
        } );
    } );

    return await data;
}

compareImagesToSync ()

let compareImagesToSync = async ($, ajaxUrl, page_num) => {

    let fetchImagesFromDB = async ($, ajaxUrl) => await $.post(ajaxUrl, { action: "get_images_from_db" });

    let fetchImagesFromAPI = async () => await getLicensedImages(page_num, 2);

    let request = async () => await axios.all([fetchImagesFromDB($, ajaxUrl), fetchImagesFromAPI()])
    .then(axios.spread( (db, api) => {
        let dbImages = JSON.parse(db);
        return diffArray(dbImages, api);
    } ))
    .catch(e => console.log(e));

    return await request();
}

getImageDetails ()

let getImageDetails = async ( image_id = null ) => {

    if(image_id == null || image_id == "" || image_id.length <= 0) return;

    image_id = image_id.map( v => `id=${v}` ).join('&')

    const APIURL = `https://api.shutterstock.com/v2/images?${image_id}&view=full`;

    const request = async () => await axios.get(APIURL, { headers: auth_header() } );

    return await request();
}

diffArray ()

let diffArray = (arr1, arr2) => {

  var newArr = [];

  arr1.map(val => arr2.indexOf(val) < 0 ? newArr.push(val) : '');

  arr2.map(val => arr1.indexOf(val) < 0 ? newArr.push(val) : '');

  return newArr;

}

А здесь функция PHP, которая обрабатывает запрос Ajax. Это может не относиться к моему вопросу, но я добавляю это для лучшего понимания моего кода:

add_action( 'wp_ajax_insert_sync_data_db', 'create_shutterstock_image_post' );
add_action( 'wp_ajax_nopriv_insert_sync_data_db', 'create_shutterstock_image_post' );
function create_shutterstock_image_post(){

    ini_set('max_execution_time', 600);
    foreach ($_POST["imageData"] as $value) {
        $postarr = array(
            "post_content" => $value['keywords'],
            "post_title" => $value['description'],
            "post_excerpt" => $value['description'],
            "post_status" => "publish",
            "post_type" => "portfolio",
            "guid" => $value['id'],
            "post_name" => $value['id'],
            "meta_input" => array(
                '_bk_portfolio_thumbnail_behavior' => 'content_link', 
                '_bk_page_builder_item_size_combobox' => 'one_one',
                '_bk_page_builder_items_combobox' => 'bk_accordion',
                '_bk_page_layout' => 'fixed_centered',
                '_bk_fixed_page_width' => '1024',
                '_bk_page_fullscreen_background_content', 'bk-none'
            )
        );
        $postID = wp_insert_post($postarr, true);

        Generate_Featured_Image($value['preview_url'], $postID);
    }
    wp_die();
}

Функция для обработки запроса, отправленного compareImagesToSync()

add_action( 'wp_ajax_get_images_from_db', 'get_images_from_db' );
add_action( 'wp_ajax_nopriv_get_images_from_db', 'get_images_from_db' );
function get_images_from_db(){
    ini_set('max_execution_time', 1000);
    $image_ids = array();
    $query = new WP_Query(array("post_type" => "portfolio", "posts_per_page" => "-1", "post_status" => "publish"));

    if($query->have_posts()){
        while ($query->have_posts()) {
            $query->the_post();
            $image_ids[] = basename( get_permalink() ); 
        }
    }

    echo json_encode($image_ids);

    wp_die();
}

Generate_Featured_Image ()

function Generate_Featured_Image( $image_url, $post_id  ){
    $upload_dir = wp_upload_dir();
    $image_data = file_get_contents($image_url);
    $filename = basename($image_url);
    $file = (wp_mkdir_p($upload_dir['path'])) ? $upload_dir['path'] . '/' . $filename : $upload_dir['basedir'] . '/' . $filename;
    file_put_contents($file, $image_data);

    $wp_filetype = wp_check_filetype($filename, null );
    $attachment = array(
        'post_mime_type' => $wp_filetype['type'],
        'post_title' => sanitize_file_name($filename),
        'post_content' => '',
        'post_status' => 'inherit'
    );
    $attach_id = wp_insert_attachment( $attachment, $file, $post_id );
    require_once(ABSPATH . 'wp-admin/includes/image.php');
    $attach_data = wp_generate_attachment_metadata( $attach_id, $file );
    $res1= wp_update_attachment_metadata( $attach_id, $attach_data );
    $res2= set_post_thumbnail( $post_id, $attach_id );

    return (!$res1 || !$res2) ? false : true;


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...