Node中的Promise.all未定义

时间:2016-12-23 22:38:01

标签: javascript node.js promise

我正在玩Node.js中的promises,我正在尝试使用Promise.all。我正在推送三个函数,它们将一个promise返回到一个数组中,然后调用Promise.all但是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 个答案:

答案 0 :(得分:1)

这很奇怪,因为我甚至在旧的Node 0.12上定义了Promise.all。在节点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-promise那样的承诺版本的I / O.返回promise的函数可以简单如下:

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

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

有关详细信息,请参阅this answer