介紹鏈接多個異步功能
我有一個問題來自這一個來:
Loop calling an asynchronous function
一旦我得到了一個循環調用使用承諾狀圖案異步函數(jsdeferred使用SDK開發的附加組件庫)。
var sess = ...;
Deferred.define(this);
function asyncFunction (session) {
Deferred.next(function() {
var d = new Deferred();
(new Request({
url: form.php,
content: "sess=" + session,
onComplete: function (response) {
d.call(response.json);
}
})).get();
return d;
}).next(function(resp) {
if (resp.id) {
asyncFunction(session);
console.log(resp.msg);
}
});
}
asyncFunction(sess);
我想鏈新asynchrnous功能到這個請求,例如,打開瀏覽器的標籤:我不想繼續執行,直到已準備就緒。
問題
所以我得到這樣的:
var sess = ...;
Deferred.define(this);
function asyncFunction (session) {
Deferred.next(function() {
var d = new Deferred();
(new Request({
url: form.php,
content: "sess=" + session,
onComplete: function (response) {
d.call(response.json);
}
})).get();
return d;
})
.next(function(resp) {
var d = new Deferred();
// Load tab
tabs.activeTab.url = 'http://foo.com';
tabs.activeTab.on('ready', function() {
console.log(resp.id);
d.call(resp.id);
});
return d;
})
.next(function(resp) {
if (resp.id) {
asyncFunction(session);
console.log(resp.msg);
}
});
}
asyncFunction(sess);
而我得到的是,對於循環的每個迭代,它再次運行所有先前請求的結果!所以,我得到了下面的日誌中我的控制檯:
id1
msg1
id1
msg1
id2
msg2
id1
msg1
id2
msg2
id3
msg3
...
顯然,我的預期是:
id1
msg1
id2
msg2
id3
msg3
問題
很清澈,我不明白的承諾的模式。我在兩個API讀了很多:
首先是我一直使用到現在爲止的一個。當我嘗試要求庫中的第二個給出了一個錯誤:
const { defer } = require('api-utils/promise'); (+)
所以,我的問題是,如果你知道承諾的任何好的教程或一些很好的例子約鏈接多個異步函數。或者如果你知道如何去做,你會怎麼做。
謝謝
編輯:給予行(+)
error: An exception occurred.
Traceback (most recent call last):
File "resource://ares-at-iiia-dot-csic/api-utils/lib/promise.js", line 16, in
}.call(this, function(require, exports) {
File "resource://ares-at-iiia-dot-csic/api-utils/lib/promise.js", line 6, in return function promised
if (typeof(define) === 'function') { // RequireJS
File "function promisedConcat(promises, unknown) {return promises.then(function (values) {return resolve(unknown).then(function (valu
e) {return values.concat(value);});});", line NaN, in function promisedConcat
File "function execute(args) {return call.apply(call, args);", line NaN, in function execute
File "exports.reject = reject;var promised = function() {var call = Function.call;var concat = Array.prototype.concat", line NaN, in
exports.reject = reject;var promised = function
File "function reject(reason, prototype) {var deferred = defer(prototype);deferred.reject(reason);return deferred.promise;", line NaN
, in function reject
File "exports.resolve = resolve", line NaN, in exports.resolve = resolve
File "function resolve(value, prototype) {var deferred = defer(prototype);deferred.resolve(value);return deferred.promise;", line NaN
, in function resolve
File "exports.defer = defer", line NaN, in exports.defer = defer
File "if (pending) {pending.push([resolved, rejected]);} else {result.then(resolved, rejected);}return deferred.promise;}}});var defe
rred = {promise: promise, resolve: function resolve(value) {if (pending) {result = isPromise(value) ? value : resolution(value);while (
pending.length) {result.then.apply(result, pending.shift());}pending = null;}}, reject", line NaN, in if
File "function rejected(reason) {deferred.resolve(reject(reason));", line NaN, in function rejected
File "function resolved(value) {deferred.resolve(resolve(value));", line NaN, in function resolved
File "function defer(prototype) {var pending = [], result;prototype = prototype || prototype === null ? prototype : Object.prototype;
var promise = Object.create(prototype, {then: {value: function then(resolve, reject) {var deferred = defer(prototype);resolve = resolve
? attempt(resolve) : resolution;reject = reject ? attempt(reject) ", line NaN, in function defer
File "function isPromise(value) {return value && typeof value.then === "function";", line NaN, in function isPromise
File "function attempt(f) {return function effort(options) {try {return f(options);} catch (error) {return rejection(error);}};", lin
e NaN, in function attempt
File "function rejection(reason) {return {then", line NaN, in function rejection
File "function resolution(value) {return {then", line NaN, in function resolution
File "((function (require, exports) {"use strict"", line NaN, in
File "resource://ares-at-iiia-dot-csic/api-utils/lib/globals!.js", line 75, in getter
value: define.bind(this)
TypeError: can't redefine non-configurable property 'define'
是您的加載項SDK版本目前? 'promise'模塊已添加到Add-on SDK 1.7中。 – 2012-07-12 12:39:41
是的,我有1.8版本。我在api-utils文件夾中找到了該庫。我將編輯以發佈錯誤。 – synack 2012-07-13 07:10:26