BUG内容如下:
a promise was created in a handler but was not returned from it
代码:
//异步请求1
function runAsync1() {
var p = new Promise(function (resolve, reject) {
//做一些异步操作
setTimeout(function () {
console.log('异步任务1执行完成');
resolve('随便什么数据1');
}, 1000);
});
return p;
}
//异步请求2
function runAsync2() {
var p = new Promise(function (resolve, reject) {
//做一些异步操作
setTimeout(function () {
console.log('异步任务2执行完成');
resolve('随便什么数据2');
}, 5000);
});
return p;
}
var promise = runAsync1()
.then(function(data){
console.log(data);
runAsync2();
return null;//1、解决成功,这个办法不是很好
}).catch(function(e){
console.log(e);
});
办法3:
promise.then(function() {
runAsync2();
});
办法4:
runAsync1()
.then(function(data){
reurn runAsync2();
}).catch(function(e){
console.log(e);
});
二种解决办法:
1、在错误的行的下面添加 return null (这个办法不是很好)
2、拿掉catch (这个办法不是很好)
3、拿着原来的promise,继续then
4、都return一下
出现异常地方的截图:
2591行,这里X为undefine,然后944行就进入了if里面了,错误警告信息就是在if里面。
如果拿掉catch,到了这一步会终止,不继续往下执行了
导致这个的警告原因:
我对上图的猜想+下面展示的图的理解:首先要知道Promise都是循环调用then(),由上一个then()调用下一个then(),这是一个链式规则
runAsync1.then(){
runAsync2(); //这里没有return 一个then,所以为导致错误
}.catch(function(e){
})
当你 return runAsync2();就可以结束错误了,如果你的runAsync1是最后一个then,那么就可以不用继续return了,也不会报错。
。核心思想就是要链式调用,破坏链式的都不正确。下图是在gitHub上看到有人出现我这样的警告,它是调用somehingComplicated()出现的警告信息
我对下图的猜想+理解:他的道理跟上面的差不多,都必须要链式调用,那个人没有retrun 一个Promise的对象回来,后续的then立即调用了
请勿打我脸,哈哈哈哈哈哈
参考网址:
http://taoofcode.net/promise-anti-patterns/ (别人的截图.png的地址)
https://github.com/petkaantonov/bluebird/issues/508 (解释.png的地址)
感觉这篇博客还是没写好,后面有时间,我再重稿一次