2015-12-02 3 views
0

У меня возникают проблемы с поиском использования обещаний, а также признаю, что мое понимание их очень элементарно. Из того, что я могу сказать, они просто напоминают поведение синхронизации.Можно ли обезопасить кучу асинхронных нагрузок?

Возможно ли использовать обещания и сохранить поведение async, а затем использовать() после завершения их работы?

Такие, как это ...

var fileRegister = [ 'fileA', 'fileB', 'fileC' ]; 

for(i in fileRegister) { 
    asyncLoadFile(fileRegister[ i ], function(err, data) { 
    delete fileRegister[ i ]; 
    if (! fileRegister.length) { 
     console.log('done'); 
    } 
    }); 
} 
+0

Похоже, что вы ищете [ 'Promise.all'] (https://developer.mozilla.org/en- US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all) – Bergi

+0

FYI, используя 'delete' в элементе массива, не меняет' .length' в массиве. Он просто очищает эту запись массива. – jfriend00

+0

Это половина псевдокода, я его никогда не запускал. –

ответ

2

Да, вы можете использовать Promise.all ждать на несколько обещаний:

var fileRegister = [ 'fileA', 'fileB', 'fileC' ]; 

// returns a promise for a file 
function loadFile(filename) { 
    return new Promise(function (resolve, reject) { 
     asyncLoadFile(filename, function (err, data) { 
      if (err) { 
       reject(err); 
      } 
      resolve(data); 
     }); 
    }); 
} 

Promise.all(fileRegister.map(loadFile)) 
    .then(function (files) { 
     console.log("done"); 
    }); 
+0

спасибо. –

1

Я действительно surpised, кажется, нет authoratative ответ на это на сайте. Да, вы можете создать кучу обещаний (каждая упаковка операция асинхронной), а затем вызвать обещание, все, что позволит решить сразу все они делают:

var p1 = new Promise(function(resolve, reject) { 
    setTimeout(resolve, 1000, "one"); 
}); 
var p2 = new Promise(function(resolve, reject) { 
    setTimeout(resolve, 2000, "two"); 
}); 
var p3 = new Promise(function(resolve, reject) { 
    setTimeout(resolve, 3000, "three"); 
}); 
var p4 = new Promise(function(resolve, reject) { 
    setTimeout(resolve, 4000, "four"); 
}); 
var p5 = new Promise(function(resolve, reject) { 
    reject("reject"); 
}); 

Promise.all([p1, p2, p3, p4, p5]).then(function(value) { 
    console.log(value); 
}, function(reason) { 
    console.log(reason) 
}); 

Это часть^спецификации E и поддерживается большинством реализации.

+0

Спасибо за ваш ответ, это было очень полезно, помогая моему пониманию. –

Смежные вопросы