例如
p = new Promise(function (resolve, reject) {
throw 'err';
});
p.done();
Run Code Online (Sandbox Code Playgroud)
在大多数promise polyfill库中,done将抛出一个错误,当前执行将退出.
但如果我们使用p.then()
,什么都不会发生.承诺吞噬了这个错误.如果我们使用p.catch
,我们无法退出当前执行.我希望实现以下目标:
try {
// something
} catch (err) {
if (check(err)) {
throw err;
}
}
Run Code Online (Sandbox Code Playgroud) 假设我有以下内容Promise
:
function doSomethingAsynchronous() {
return new Promise((resolve) => {
const result = doSomeWork();
setTimeout(() => {
resolve(result);
}), 100);
});
}
Run Code Online (Sandbox Code Playgroud)
在什么时候被doSomeWork()
称为?它Promise
是在建造之后立即建造的吗?如果没有,是否还有一些我需要明确做的事情来确保Promise
运行的主体?
我有这种情况,我想知道一个承诺的状态.下面,该函数start
仅someTest
在它不再运行时调用(Promise未挂起).该start
函数可以多次调用,但如果在测试仍在运行时调用它,它将不会等待并返回false
class RunTest {
start() {
retVal = false;
if (!this.promise) {
this.promise = this.someTest();
retVal = true;
}
if ( /* if promise is resolved/rejected or not pending */ ) {
this.promise = this.someTest();
retVal = true;
}
return retVal;
}
someTest() {
return new Promise((resolve, reject) => {
// some tests go inhere
});
}
}
Run Code Online (Sandbox Code Playgroud)
我找不到简单检查承诺状态的方法.喜欢的东西this.promise.isPending
会很好:)任何帮助将不胜感激!
我正在编写一个使用新的es6 promises的JavaScript库.我可以在Firefox中测试库,因为已经定义了promises.但是,当我尝试使用Karma和PhantomJS测试我的代码时,我收到错误Can't find variable: Promise.
.我猜这是因为PhantomJS浏览器还不支持es6承诺.
如何配置Karma为承诺引入polyfill?
所以我读过,在一些即将推出的JavaScript MVC中,observable正在寻求超越承诺:
观察与承诺之间有什么区别?
更新:道歉!删除了我的虚假陈述.
所以我正在用打字稿学习Angular 2.
我正在努力编写一个模拟服务,我相信如果服务成功获取对象,则应返回Promise,如果发生任何事情则返回错误.
我尝试过以下代码,但看起来它不是打字稿的写法语法.
更新了CODE:
saveMyClass(updatedMyClass: MyClass){
//saving MyClass using http service
//return the saved MyClass or error
var savedMyClass : MyClass = someLogicThatReturnsTheSavedObject(updatedMyClass);
if(isSomeCondition)
return Promise.reject(new Error('No reason but to reject'));
else
return new Promise<MyClass>(resolve => {setTimeout( ()=>resolve(savedMyClass),1500 )} );
}
Run Code Online (Sandbox Code Playgroud)
但令我惊讶的是,打字稿抱怨"返回表达式中没有最常见的类型".
什么应该是正确的代码?因此,如果返回正确的MyClass,我可以使用我的组件来消费,如果服务中存在任何MyClass则反映错误.
谢谢
与这个问题类似,但我并没有询问承诺如何起作用,我特别想知道:
在返回Promise的东西中包装setTimeout的标准/最佳方法是什么?我在想像Angular的功能,但不是Angular特有的.$timeout
reject()
调用promise 回调后,Chrome控制台中会显示警告消息"Uncaught(in promise)".我不能围绕它背后的原因,也不知道如何摆脱它.
var p = new Promise((resolve, reject) => {
setTimeout(() => {
var isItFulfilled = false
isItFulfilled ? resolve('!Resolved') : reject('!Rejected')
}, 1000)
})
p.then(result => console.log(result))
p.catch(error => console.log(error))
Run Code Online (Sandbox Code Playgroud)
警告:
编辑:
我发现如果onRejected
没有向.then(onResolved, onRejected)
方法显式提供处理程序,JS将自动提供隐式处理程序.它看起来像这样:(err) => throw err
.自动生成的处理程序将依次抛出.
参考:
如果IsCallable(onRejected)`为false,那么
让onRejected为" Thrower ".
http://www.ecma-international.org/ecma-262/6.0/index.html#sec-performpromisethen
当我开始研究Promise
s时,我的理解已经停止在我未发现的下面的问题上(我发现所有这些都是对Promise
构造函数的具体讨论,以及Promise
' then
'函数 - 但不是一个比较它们的设计模式的讨论).
1. Promise
构造函数
从MDN文档中,我们使用了Promise构造函数(添加了我的注释):
new Promise(function(resolve, reject) { ... }); // <-- Call this Stage 1
Run Code Online (Sandbox Code Playgroud)
带有两个参数的函数对象
resolve
和reject
.第一个参数履行承诺,第二个参数拒绝承诺.一旦我们的操作完成,我们可以调用这些函数.
2. then
功能
移动到then
功能,可以在一个被称为Promise
对象(返回一个新的Promise
对象),我们有由文档中描述的以下函数签名(加上我的意见):
p.then(onFulfilled, onRejected);
Run Code Online (Sandbox Code Playgroud)
链接
因为该
then
方法返回Promise,所以您可以轻松地链接然后调用.
var p2 = new Promise(function(resolve, reject) {
resolve(1); // <-- Stage 1 again
});
p2.then(function(value) {
console.log(value); // 1
return value + 1; // <-- Call …
Run Code Online (Sandbox Code Playgroud) NodeJS 0.11以及io.js和Node 0.12分支都附带本机承诺.
本机承诺有一个.then
总是在未来事件循环周期上执行的方法.
到目前为止setImmediate
,自从我从nextTick切换以来,我一直在使用事件循环到事件循环的下一次迭代:
setImmediate(deferThisToNextTick); // My NodeJS 0.10 code
process.nextTick(deferThisToNextTick); // My NodeJS 0.8 code
Run Code Online (Sandbox Code Playgroud)
因为我们现在有了一种新方法:
Promise.resolve().then(deferThisToNextTick);
Run Code Online (Sandbox Code Playgroud)
我应该使用哪个?此外 - 对于在事件循环之前或之后运行的代码,它的Promise.resolve.then
作用是什么setImmediate
样的nextTick
?
es6-promise ×10
javascript ×9
promise ×8
ecmascript-6 ×5
angular ×1
catch-block ×1
karma-mocha ×1
karma-runner ×1
node.js ×1
phantomjs ×1
typescript ×1