看一個經典ajax回調的例子:
function foo(x, y, cb) {ajax("http://some.url.1/?x=" + x + "&y=" + y,cb);
}foo(11, 31, function(err, text) {if(err) {console.error(err);}else {console.log(text);}
});// 異步請求some.url.1參數為x =11, y=31的數據.
// 請求 成功/失敗 將數據打印到控制臺
下面介紹一個異步迭代生成器…一開始可能會有點怪…但是它引用方便、有很大的擴展空間
// 我們想調用的時候(向調用同步函數那樣)順序調用.
// 它可能會報錯,于是丟到try...catch塊中
function *main(){ try{var text = yield foo(11, 31);console.log(text);}catch(err){console.error(err);}
}
// 下面定義foo函數
function foo(x, y) {ajax("http://some.url.1/?x=" + x + "&y=" + y,function(err, data) {if(err) {it.throw(err);}else{it.next(data);}});
}
// foo函數,請求數據,若出錯,將信息拋出,若成功則調用next(data)// 啟動
var it = main();
it.next();
Promise實現上面的方法:
function foo(x, y) {return request("http://some.url.1/?x=" + x + "&y=" + y);
}
foo(11, 31)
.then(function(text) {cosnole.log(text);},function(err) {console.error(err);}
);
把支持Promise的foo和生成器*main()放在一起:
function foo(x, y) {return request("http://some.url.1/?x=" + x + "&y=" + y);
}function *mian(){try{var text = yield foo(11, 31);console.log(text);}catch(err){console.err(err);}
}
// 調用
var it = main();var p = it.next().value;p.then(function(text) {it.next(text);},function(err){it.throw(err);}
);
參考《你不知道的JavaScript》(中卷)P250