hba*_*hba 2 javascript node.js q
NodeJS新手.通过承诺教程('promise-it-wont-hurt')我有以下脚本:
var Q = require('q');
var deferred = Q.defer();
deffered.resolve('SECOND');
deffered.promise.then(console.log);
console.log('FIRST');
Run Code Online (Sandbox Code Playgroud)
输出:
FIRST
SECOND
Run Code Online (Sandbox Code Playgroud)
我不明白,我会想到,既然已经解决了,那么我应该先看到第二个.
他们解释说,这是因为"Promise在事件循环的同一转弯时触发".我不明白这意味着什么......
基本上,重点是promise的then处理程序在当前代码流完成执行并且控制权返回执行环境(在本例中为Node)之前不会运行.
这是Promises/A +兼容承诺的一个重要特征,因为它确保了可预测性.无论承诺是否立即解决:
function getAPromise() {
var Q = require('q');
var deferred = Q.defer();
deferred.resolve('SECOND');
return deferred.promise;
}
getAPromise().then(console.log);
console.log('FIRST');
Run Code Online (Sandbox Code Playgroud)
或者是否在10秒后结算:
function getAPromise() {
var Q = require('q');
var deferred = Q.defer();
setTimeout(function () {
deferred.resolve('SECOND');
}, 10000);
return deferred.promise;
}
getAPromise().then(console.log);
console.log('FIRST');
Run Code Online (Sandbox Code Playgroud)
你可以放心,FIRST它将永远记录下来.
在第2章和第3章中详细讨论了这个问题.你不知道JS - 异步和性能.有时异步运行并且有时同步运行的异步操作称为Zalgos,它们不被认为是一件好事.
值得注意的是,jQuery中广泛使用的promise 不遵守这种行为,并且还存在许多其他问题.如果您发现自己有一个jQuery承诺,请将其包装在适当的承诺中并继续:
Q($.ajax(...)).then(breatheWithEase);
Run Code Online (Sandbox Code Playgroud)