Почему `Promise.then ()` выполняется перед завершением `Promise.all ()`? - PullRequest
0 голосов
/ 10 октября 2018

Я хочу выполнить код после создания списка файлов, но этот код выполняется раньше.

Проверьте комментарии в следующем псевдокоде для лучшего понимания.

Псевдокод:

var fs = require('fs');

Promise.all([
    fs.writeFile(...),
    list.forEach(element => {      // I think the problem is here
        fs.writeFile(...);         // The files content is big
        console.log(element.name); // This is printing after then() method
    })
]).then((v) => {
    console.log(v); // This is printing before the files being created
});

Я надеюсь, что объяснил мою проблему хорошо.Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 11 октября 2018

Просто для справки. Я демонстрирую способ сделать любую асинхронную функцию для обещания.

const fs = require('fs');
const writeFile = function(file, data, options){
    new Promise((resolve,reject) => {
        fs.writeFile(file, data, options, (err) => {
            if(err){
                return reject(err);
            }
            return resolve();
        });
    });
}

Теперь вы можете использовать эту функцию writeFile следующим образом

writeFile(filePath, data, options)
    .then(() => {
        // operation successful, handle your logic here
    }).catch((e) => {
        // something is wrong, handle the error here.
    });

Один развы знаете, как работает обещание, тогда действительно просто преобразовать асинхронные функции.

Чтобы использовать эту функцию в Promise.all, мы можем сделать следующее:

Promise.all([
    writeFile(...), // pass your arguments here
    ...list.map(element => { // convert list to an array of promises
        // use the function to create a promise as following, 
        // make sure to match the arguments as per your need 

        return writeFile(element.filePath, element.data, element.options);
    })
]).then((v) => {
    console.log(v);
});

Чтобы подвести итог происходящемуздесь мы создаем массив обещаний и передаем его в функцию Promise.all.И мы создаем массив обещаний, используя базовую функцию writeFile, которая возвращает обещание и разрешается после записи файла.Мы используем оператор растяжения es6 ..., чтобы распространить элементы объекта list.

Я надеюсь, что это может помочь кому-то в будущем.

0 голосов
/ 10 октября 2018

Promise.all ожидаем массив Promise.Если то, что вы передаете в массиве, не является Обещанием, оно будет немедленно разрешено.

fs.writeFile возвращает , а не возвращает Обещание, это функция nodeJS, которая ожидает обратного вызоваформа (err, result).Вы можете использовать util.promisify, чтобы сделать его функцией, возвращающей Обещание.

Ваш второй аргумент даже меньше Обещания, так как это просто forEach.Это можно исправить, вернув вместо этого Promise.all из list.map(...), где функция отображения возвращает обещание.

0 голосов
/ 10 октября 2018

Используя bluebird обещание, мы можем получить обещание возврата.

const writeFile = require("bluebird").promisify(fs.writeFile);

Promise.all([
    fs.writeFile(...),
    ...list.map(element => {
        console.log(element.name); 
        return writeFile(...);   
    })
]).then((v) => {
    console.log(v);
});
0 голосов
/ 10 октября 2018

Promise, возвращаемое Promise.all(), будет разрешено, если все обещания, которые вы ему передали, будут разрешены.

Обратите внимание, что fs.writeFile не возвращает обещания, но вы можете использовать fs Promises API , импортируя взамен

var fs = require('fs').promises

(но будьте осторожны, это экспериментально).

Но тогда вы все равно передадите только одно обещание: fs.writeFile(...).

list.forEach(...) не возвращает Promise, поэтому Promise.all() не может его ждать.

Попробуйте что-то вроде (псевдокод):

Promise.all([
    fs.writeFile(...),
    ...list.map(element => { // convert list to an array of promises
        console.log(element.name); 
        return fs.writeFile(...);   
    })
]).then((v) => {
    console.log(v);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...