2016-12-23 2 views
0

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

Почему 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); 
     }); 
    }); 
} 
+0

'Почему Promise.all никогда не возвращается', потому что' Promise.all является «неопределенным» '- вы не можете« возвращать »из функции, которая не существует, - вы уверены, что у вас нет« перегруженных »обещаний с некоторой нарушенной реализацией Promise –

+0

Что это за функция '' resolve' ', которую вы вызываете? – Bergi

+0

Все, что у меня есть, требуется («обещание»). Я поставил точку останова в самом начале точки ввода моего приложения и вижу, что Promise.all уже не определен, поэтому не похоже, что он был «перегружен» позже. Завершение кода также не автозаполняет Promise.all. Для записи .. node -v is v4.4.7 – YuriW

ответ

0

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

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

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

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

См this answer для более подробной информации.

+0

Извините, я забыл упомянуть, что это все в другом обещании. В любом случае я поставил точки останова в обеих функциях в Promise.all (...), после чего они никогда не попадали. Спасибо за предложения, учусь от ошибок уже :) – YuriW