我编写的代码看起来像:
function getStuffDone(param) { | function getStuffDone(param) {
var d = Q.defer(); /* or $q.defer */ | return new Promise(function(resolve, reject) {
// or = new $.Deferred() etc. | // using a promise constructor
myPromiseFn(param+1) | myPromiseFn(param+1)
.then(function(val) { /* or .done */ | .then(function(val) {
d.resolve(val); | resolve(val);
}).catch(function(err) { /* .fail */ | }).catch(function(err) {
d.reject(err); | reject(err);
}); | });
return d.promise; /* or promise() */ | });
} | }
Run Code Online (Sandbox Code Playgroud)
有人告诉我这个被称为" 延迟反模式 "或" Promise构造函数反模式 ",这个代码有什么不好,为什么这被称为 …
回调Promise.all(arr).then在数组完成之前执行,因此它不会捕获其元素。我怎样才能正确地做到这一点?
var arr = [];\n\nfor (var i = 0; i < 2; i++) {\n arr.push((function() {\n new Promise(function(resolve, reject) {\n setTimeout(function() {\n console.log("Resolved!");\n resolve();\n }, 3000);\n });\n })());\n}\n\nPromise.all(arr).then(function() {\n console.log("Done");\n});Run Code Online (Sandbox Code Playgroud)\r\n我的预期结果是:
\nResolved!\nResolved!\nDone\nRun Code Online (Sandbox Code Playgroud)\n但真实的结果是:
\nDone\nResolved!\nResolved!\nRun Code Online (Sandbox Code Playgroud)\n上面的代码只是一个例子。我更改了如下结构,代码不再有问题,但由于我的应用程序结构,我应该使用for循环。push
var p1 = new Promise(function(resolve, reject) {\n setTimeout(function() {\n console.log("Resolved #1");\n resolve();\n }, 1000);\n});\nvar p2 = new Promise(function(resolve, reject) {\n setTimeout(function() {\n console.log("Resolved #2");\n resolve();\n }, …Run Code Online (Sandbox Code Playgroud)