Promise.all в Node - undefined

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

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

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

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. На Node 0.10 У меня есть обещание не определено. Я не думаю, что есть версия с Promise, но без Promise.all. Может быть, вы делаете:

Promise.all = undefined;

Что вы должны иметь 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-promise, если вы все равно выполняете promises. Ваша функция, которая возвращает обещание, может быть простой:

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

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

Подробнее см. этот ответ.