数码资讯
Javascript异步编程承诺模式的6个特点
在开始正式介绍之前,我们想看看Javascript的承诺是什么样子的: 复制代码代码如下所示: 新的承诺(函数(解析,拒绝){ 解析(Hello World); }); P.then(功能(STR){) 警报(STR); }); 1。然后()返回一个分叉的承诺 下面两段代码的区别是什么 复制代码代码
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
在开始正式介绍之前,我们想看看Javascript的承诺是什么样子的:
复制代码代码如下所示:
新的承诺(函数(解析,拒绝){
解析(Hello World);
});
P.then(功能(STR){)
警报(STR);
});
1。然后()返回一个分叉的承诺
下面两段代码的区别是什么
复制代码代码如下所示:
展品
var =新(承诺)…**;
P.then(func1);
P.then(还是一样的);
展品
var =新(承诺)…**;
P.then(func1)
然后(还是一样的);
如果你是认真的在两部分的代码,然后承诺只是一个回调函数的一个二维数组。然而,事实并非如此。然后每()调用返回一个分叉的承诺。因此,在有,如果func1()抛出一个异常,func2()仍然是通常被称为。
在ExhibitB,如果func1()抛出一个错误,大脑()将不会被调用,因为第一个调用返回一个新的承诺,并拒绝在func1()。结果是,func2()跳过。
总结:可以通过分叉将多个路径与复杂的流程图相似。
2。回调应该通过结果
运行下面的代码时会被警告什么
复制代码代码如下所示:
新的承诺(函数(解析,拒绝){
解析(Hello World);
});
P.then(功能(STR){ })
然后(函数(STR){)
警报(STR);
});
第二个()的警报没有显示任何内容,这是因为在回调上下文中,回调函数由于结果的变化没有回调函数,所以希望回调函数返回相同的结果或返回一个替换结果,然后将其传递给下一个回调函数。
类似于适配器改变结果的使用,如下:
复制代码代码如下所示:
无功feettometres =功能(FT){ return英尺×12×0.0254 };
var =新(承诺)…**;
P.then(feettometres)
然后(函数(m){)
警戒(米);
});
三.只能捕获上层的异常。
代码的两部分有什么区别
复制代码代码如下所示:
展品
新的承诺(函数(解析,拒绝){
解析(Hello World);
})
(。然后
函数(STR){
抛出新错误(哦哦);
},
未定义
)
(。然后
未定义,
函数(错误){
警报(错误);
}
);
展品
新的承诺(函数(解析,拒绝){
解析(Hello World);
})
(。然后
函数(STR){
抛出新错误(哦哦);
},
函数(错误){
警报(错误);
}
);
在第一个代码中,抛出第一个()的异常,该异常将由第二个()()来捕获,然后将触发警报。
在第二部分中,回调函数和错误回调函数是相同的级别,这意味着当回调中抛出异常时,它不会被捕获。事实上,当承诺是否定的或者承诺本身是错误的时,只会抛出代码第二部分的错误回调。
4。可以恢复错误。
在一个错误回调函数,如果你不抛出错误,承诺假设你从错误中恢复和逆转为解决状态。在下面的例子中,我得救了将显示在第一个错误因为回调然后()不重新抛出异常。
复制代码代码如下所示:
新的承诺(函数(解析,拒绝){
拒绝(新的错误(pebkac ));
});
P.then(
未定义,
函数(错误){ }
)
(。然后
函数(STR){
警惕(我得救了)!;
},
函数(错误){
警报(坏电脑!;
}
);
承诺可以被视为洋葱上的一层,每一层()给洋葱添加另一层,每一层代表一个被处理的活动。
5。承诺可以暂停。
因为您已准备好在a()方法中执行,但这并不意味着您不能提前暂停和运行其余部分。
复制代码代码如下所示:
var =新(承诺)…**;
P.then(功能(STR){)
如果(!登陆){
返回新的承诺(…**;
}
})
然后(函数(STR){)
警报(已完成);
})
在前面的代码中,在新的承诺解析被提示之前不会出现。这是在现有异步代码路径中引入更多依赖项的一种方便方法。例如,您可能会发现用户会话已经超时,您可能希望在继续前面的代码路径之前初始化第二个登陆。
6。已解决的承诺不会立即执行。
你有提示运行下面的代码吗
复制代码代码如下所示:
功能窗口补丁(){
var I=0;
新承诺(函数(解析){)
决心();
})
然后(函数(){())
我= 2;
});
警报(一);
}
因为承诺立即被解析,然后立即()方法立即执行,所以您可能会认为,提示2将被探索,但承诺定义要求所有调用都是异步执行的,因此在修改之前会生成提示。
复制代码代码如下所示:
新的承诺(函数(解析,拒绝){
解析(Hello World);
});
P.then(功能(STR){)
警报(STR);
});
1。然后()返回一个分叉的承诺
下面两段代码的区别是什么
复制代码代码如下所示:
展品
var =新(承诺)…**;
P.then(func1);
P.then(还是一样的);
展品
var =新(承诺)…**;
P.then(func1)
然后(还是一样的);
如果你是认真的在两部分的代码,然后承诺只是一个回调函数的一个二维数组。然而,事实并非如此。然后每()调用返回一个分叉的承诺。因此,在有,如果func1()抛出一个异常,func2()仍然是通常被称为。
在ExhibitB,如果func1()抛出一个错误,大脑()将不会被调用,因为第一个调用返回一个新的承诺,并拒绝在func1()。结果是,func2()跳过。
总结:可以通过分叉将多个路径与复杂的流程图相似。
2。回调应该通过结果
运行下面的代码时会被警告什么
复制代码代码如下所示:
新的承诺(函数(解析,拒绝){
解析(Hello World);
});
P.then(功能(STR){ })
然后(函数(STR){)
警报(STR);
});
第二个()的警报没有显示任何内容,这是因为在回调上下文中,回调函数由于结果的变化没有回调函数,所以希望回调函数返回相同的结果或返回一个替换结果,然后将其传递给下一个回调函数。
类似于适配器改变结果的使用,如下:
复制代码代码如下所示:
无功feettometres =功能(FT){ return英尺×12×0.0254 };
var =新(承诺)…**;
P.then(feettometres)
然后(函数(m){)
警戒(米);
});
三.只能捕获上层的异常。
代码的两部分有什么区别
复制代码代码如下所示:
展品
新的承诺(函数(解析,拒绝){
解析(Hello World);
})
(。然后
函数(STR){
抛出新错误(哦哦);
},
未定义
)
(。然后
未定义,
函数(错误){
警报(错误);
}
);
展品
新的承诺(函数(解析,拒绝){
解析(Hello World);
})
(。然后
函数(STR){
抛出新错误(哦哦);
},
函数(错误){
警报(错误);
}
);
在第一个代码中,抛出第一个()的异常,该异常将由第二个()()来捕获,然后将触发警报。
在第二部分中,回调函数和错误回调函数是相同的级别,这意味着当回调中抛出异常时,它不会被捕获。事实上,当承诺是否定的或者承诺本身是错误的时,只会抛出代码第二部分的错误回调。
4。可以恢复错误。
在一个错误回调函数,如果你不抛出错误,承诺假设你从错误中恢复和逆转为解决状态。在下面的例子中,我得救了将显示在第一个错误因为回调然后()不重新抛出异常。
复制代码代码如下所示:
新的承诺(函数(解析,拒绝){
拒绝(新的错误(pebkac ));
});
P.then(
未定义,
函数(错误){ }
)
(。然后
函数(STR){
警惕(我得救了)!;
},
函数(错误){
警报(坏电脑!;
}
);
承诺可以被视为洋葱上的一层,每一层()给洋葱添加另一层,每一层代表一个被处理的活动。
5。承诺可以暂停。
因为您已准备好在a()方法中执行,但这并不意味着您不能提前暂停和运行其余部分。
复制代码代码如下所示:
var =新(承诺)…**;
P.then(功能(STR){)
如果(!登陆){
返回新的承诺(…**;
}
})
然后(函数(STR){)
警报(已完成);
})
在前面的代码中,在新的承诺解析被提示之前不会出现。这是在现有异步代码路径中引入更多依赖项的一种方便方法。例如,您可能会发现用户会话已经超时,您可能希望在继续前面的代码路径之前初始化第二个登陆。
6。已解决的承诺不会立即执行。
你有提示运行下面的代码吗
复制代码代码如下所示:
功能窗口补丁(){
var I=0;
新承诺(函数(解析){)
决心();
})
然后(函数(){())
我= 2;
});
警报(一);
}
因为承诺立即被解析,然后立即()方法立即执行,所以您可能会认为,提示2将被探索,但承诺定义要求所有调用都是异步执行的,因此在修改之前会生成提示。
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。