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(...);
};
Смотрите этот ответ для более подробной информации.