我知道defer分隔诺言状态的控制和过程,这里以Q为例,返回的诺言Q.defer().promise
和Q.Promise
完全不同,为什么这样设计?这两个“承诺”有什么区别
好吧,这是关于承诺解决方案源的。Q和其他许多库提供两个API:
defer
API-您可以在其中创建一个递延函数,.resolve(value)
并承诺可以返回。粗略地做:
var d = Q.defer();
setTimeout(function(){ d.resolve(); }, 1000);
return d.promise;
是相同的:
return new Promise(function(resolve, reject){
setTimeout(resolve, 1000);
});
所以你可能会问
好吧,延迟API是第一个。这是其他语言处理它的方式,论文是处理它的方式,也是人们首先使用它的方式-
但是,这两个API之间存在重要区别。Promise构造函数很安全。
承诺抽象异常处理,并且是安全的。如果将一个promise链放入其中,它将引用该规范将该异常转换为拒绝。
如果onFulfilled或onRejected抛出异常e,则必须以e为理由拒绝promise2
假设您正在从XHR请求中解析JSON:
function get(){
var d = Q.defer();
if(cached) { // use cached version user edited in localStorage
d.resolve(JSON.parse(cached));
} else { // get from server
myCallbackApi('/foo', function(res){ d.resolve(res); });
}
}
现在,让我们看一下promise构造器的版本:
function get(){
return new Promise(function(resolve, reject){
if(cached) { // use cached version user edited in localStorage
resolve(JSON.parse(cached));
} else { // get from server
myCallbackApi('/foo', resolve);
}
});
}
现在,假设服务器以某种方式向您发送了无效的JSON(或用户将其编辑为无效状态)并进行了缓存。
在延迟版本中-它是同步抛出的。因此,您通常必须谨防。在底部版本中则没有。最高版本的用法如下所示:
try{
return get().catch(function(e){
return handleException(e); // can also just pass as function
});
} catch(e){
handleException(e);
}
在底部版本中-promise构造函数会将throw
s 转换为拒绝,因此足以执行此操作:
return get().then(function(e){
return handleException(e);
});
防止发生一整类程序员错误。
问题内容: 给定下面的代码示例,行为上是否有任何差异,如果有,这些差异是什么? 据我了解,第一个将在异步函数中进行错误处理,并且错误将从异步函数的Promise中冒出来。但是,第二个需要较少的滴答声。它是否正确? 此片段只是返回Promise供参考的常用功能。 问题答案: 在大多数情况下,和之间没有可观察到的差异。这两个版本的观察行为完全相同(但根据实现的不同,该版本可能会使用更多的内存,因为可能
问题内容: Deferred,Promise和Future之间有什么区别? 这三者之间是否有公认的理论? 问题答案: 考虑到我对尝试回答OP的问题的明显不满。字面上的答案是,诺言是与其他对象共享的东西,而延期则应保持私有。首先,延期(通常扩展为Promise)可以解决自己,而Promise可能无法解决。 如果您对细节有兴趣,请检查Promises / A +。 据我所知,总体目的是提高清晰度,并通
我正在研究ES9中提出的异步生成器,以便能够掌握逻辑。 因为每个产生的值都被用作返回对象中的值属性——由Promise包装——来自下一个()调用: 我认为这对我的promise也是正确的: 因此,这些promise被合并在一起。这听起来并不坏,但我并不认为这是因为: 那么,关键字wait与关键字yield在同一个表达式中使用完全无用,还是我遗漏了一些重要的内容?
我正在使用和学习。 我不明白,使用< code >回调方法完成未来和使用promise之间的确切区别是什么? 这是否意味着未来回调方法实际上没有完成未来?只有使用promise,我们才能完成未来? 还有,我见过很多像你这样的地方,既可以阅读期货,也可以阅读无极,但你只能写信给无极。
问题内容: Promise和AJAX调用都是异步操作。两者都可以进行GET / POST请求。<< 编辑:那是错误的陈述 那么它们之间有什么区别呢?并且什么时候最好使用一个而不是另一个呢? 另外,还有一件事: 最近,我遇到了一个承诺,其中包含AJAX。为什么要在异步操作中放入异步操作?这就像在面包三明治中放一块面包。 此处使用jQuery。并且AJAX调用具有Promise行为和属性。我没有早些得
和之间有什么区别? 它们都像未来结果的占位符,但是主要区别在哪里?