Promise.all в узле не определено

Я играю с обещаниями в Node.js и пытаюсь использовать Promise.all. Я помещаю три функции, которые возвращают обещание в массив, а затем вызываю Promise.all, но решение "все" никогда не срабатывает. В отладчике также говорится, что Promise.all является "неопределенным".

Почему Promise.all никогда не возвращается и почему он отображается как "неопределенный"?

Соответствующая часть кода:

var updates = [];
updates.push(data.updateItemCondition(characterID, specificItemID_toUse, newCondition));
updates.push(data.updateCharacterLoot(characterID, newValue));
updates.push(data.updateSharedLoot(lootUpdateChange));


Promise.all(updates).then(function (success) {
    resolve("Item successfully used");
}, function (error) {
    resolve("Failed to use item " + error.toString());
});

Все три функции выглядят примерно так, как показано ниже, и с помощью отладчика я вижу, что все три разрешения решаются (и все три соответствующих файла в io.writeFile обновляются на диске)

data.updateSharedLoot= function (lootUpdateChange) {
    return new Promise(function (resolve, reject) {
        //some logic
        io.writeFile(...,function(callbackSuccess){
            resolve(callbackSuccess);
        });
    });
}

1 ответ

Это странно, потому что я определил Promise.all даже на старом Node 0.12. На узле 0.10 Promise не определен. Я не думаю, что есть версия с Promise, но без Promise.all. Может быть, вы делаете:

Promise.all = undefined;

То, что вы должны иметь неопределенный это resolve функция. Вот:

Promise.all(updates).then(function (success) {
    resolve("Item successfully used");
}, function (error) {
    resolve("Failed to use item " + error.toString());
});

у вас нет resolve звонить. Разве вы не имеете в виду console.log?

Promise.all(updates).then(function (success) {
    console.log("Item successfully used");
}, function (error) {
    console.log("Failed to use item " + error.toString());
});

Также здесь:

data.updateSharedLoot= function (lootUpdateChange) {
    return new Promise(function (resolve, reject) {
        //some logic
        io.writeFile(...,function(callbackSuccess){
            resolve(callbackSuccess);
        });
    });
}

первый параметр вашего обратного вызова, вероятно, является ошибкой, поэтому вы должны:

data.updateSharedLoot= function (lootUpdateChange) {
    return new Promise(function (resolve, reject) {
        //some logic
        io.writeFile(...,function(error, callbackSuccess) {
            if (error) {
                reject(error);
            } else {
                resolve(callbackSuccess);
            }
        });
    });
}

Но все же я бы предложил использовать обещанную версию ввода-вывода, такую ​​как fs-обещание, если вы все равно выполняете обещания. Ваша функция, которая возвращает обещание, может быть простой:

var fsp = require('fs-promise');

data.updateSharedLoot = function (lootUpdateChange) {
    return fsp.writeFile(...);
};

Смотрите этот ответ для более подробной информации.

Другие вопросы по тегам