2015-05-29 33 views
0

對於如何使用藍鳥承諾從for/while循環調用異步函數的問題似乎有很多答案,但據我所見,都需要node.js才能工作(例如promise.method()或process.nextTick();例如:While loop using bluebird promises)。在普通的js + blue bird中有沒有辦法做到這一點?謝謝你的時間。普通的JavaScript +藍鳥承諾異步的/ while循環沒有使用NODE.JS

+1

節點是普通的js。 (另外,你的鏈接沒有節點引用) – Amit

+0

對不起,但我沒有使用node.js - 你告訴我,.method()和process.nextTick()可用作node.js之外的js函數嗎? – user3306881

+0

我不知道'promise.method()'是什麼,或者你看到了什麼。 (也不在鏈接中) – Amit

回答

0

那麼,一旦事情是一個承諾返回函數 - 你真的不關心庫負責的爲您的環境:

Promise.delay(1000); // an example of an asynchronous function 

this question上轉換功能,以保證返回的。

現在,一旦你有那種功能的循環變得非常簡單:

function whileLoop(condition, fn){ 
    return Promise.try(function loop(val){ 
      return Promise.resolve(condition()).then(function(res){ 
       if(!res) return val; // done 
       return fn().then(loop); // keep on looping 
      }); 
    }); 
} 

這將讓你做這樣的事情:

var i = 0; 
whileLoop(function(){ 
    return i < 10; // can also return a promise for async here 
}, function body(){ 
    console.log("In loop body"); 
    i++; 
    return Promise.delay(1000); 
}).then(function(){ 
    console.log("All done!"); 
}); 

爲了證明這一點的工作在瀏覽器中 - 這裏的a JSFiddle

+0

非常感謝 - 我會試試這個 – user3306881

+0

@ user3306881剛剛添加了一個jsfiddle,以便您可以在瀏覽器中試用它。 –

+0

我得到Uncaught TypeError:Promise.try不是一個函數whileLoop @ promise loops v3.html:32initialize @ promise loops v3.html:17 - 任何想法? – user3306881