我正在阅读Async& amp; YDKJS系列的性能书,我在绕着揭示的构造函数模式缠绕我的问题。
这是本书给出的例子:
function foo(x) {
// start doing something that could take a while
// construct and return a promise
return new Promise( function(resolve,reject){
// eventually, call `resolve(..)` or `reject(..)`,
// which are the resolution callbacks for
// the promise.
} );
}
var p = foo( 42 );
function bar(fooPromise) {
// listen for `foo(..)` to complete
fooPromise.then(
function(){
// `foo(..)` has now finished, so
// do `bar(..)`'s task
},
function(){
// oops, something went wrong in `foo(..)`
}
);
}
bar( p );
我有两个问题:
我认为目的不是要向外部公开决策并拒绝逻辑,这会在承诺逻辑与函数中.then()
接下来发生的事情之间产生良好的关注分离(在此案件bar()
)"听"承诺。我在这里吗?
示例foo()
让我感到困惑。在评论// start doing something that could take a while
中,究竟是什么?这是您的异步调用吗?它不应该在return语句中的函数内吗?我不明白这会如何起作用。
答案 0 :(得分:1)
我认为目的不是要向外界揭露决心并拒绝逻辑,这会产生良好的关注分离
是的,以及在deferred pattern中捕获异常的难度,这是另一种方法,只将解析器暴露给创建任务的函数,而不是那些消耗结果的函数。
示例
foo()
让我感到困惑。在评论// start doing something that could take a while
中,究竟是什么?这是您的异步调用吗?
是的,这就是他们的意思。
它不应该在return语句中的函数内吗?
是的,确实应该如此。具体示例可能是
function delay(x) {
return new Promise(function(resolve) { // construct and return a promise
setTimeout(function() { // start doing something that could take a while
resolve(); // eventually, call one of the resolution callbacks
}, x);
});
}
当然可能启动任务并等待其结果是两个单独的陈述,因此它们理论上可以分开:
function ajax(x) {
var xhr = new XMLHttpRequest();
xhr.open("GET", x);
xhr.send(); // start doing something that could take a while
return new Promise(function(resolve, reject) { // construct and return a promise
xhr.onload = resolve;
xhr.onerror = reject; // eventually, call one of the resolution callbacks
});
}
但这是一种不良做法,因为当new
,open
或send
投掷时,您不会得到被拒绝的承诺,而是例外。所以var xhr = …
中的所有内容都应该在promise构造函数的回调中。
答案 1 :(得分:-1)
对于2.,一般而言,没有进一步的细节,是的,你是对的;传递给resolver
构造函数的Promise
函数立即执行。一个例外是使用async/await
,但async/await
未出现在JavaScript的问题上。