现代JS /承诺新手在这里。尽管有关该主题的大量内容,但我很难找到一个简单问题的答案。
我相信我对JS Promises有一个很好的理解(感谢各种来源,包括mdn和https://spin.atomicobject.com/2016/02/16/how-javascript-promises-work/)
我已经以最简单的形式定期使用和制作Promise,但是我继续使用以下模式绊倒我继承的项目中的方法:
const doAsyncOp = () =>
$http.get(uri)
.then(
value => value,
reject => //...
);
我的一个大问题是:当您只是从成功处理程序返回一个值时会发生什么?我需要使用这种方法,并且需要访问' value'在客户端代码中。这在技术上是不是处理?我应该重写实现吗?
答案 0 :(得分:2)
我的一个大问题是:当您只是从成功处理程序返回一个值时会发生什么?
当您从.then()
处理程序返回一个值时,该值将成为父承诺链的已解析值:因此,在此代码中:
// utility function that returns a promise that resolves after a delay
function delay(t, v) {
return new Promise(resolve => {
setTimeout(resolve.bind(null, v), t);
});
}
function test() {
return delay(100, 5).then(val => {
// this return value becomes the resolved value of the promise chain
// that is returned from this function
return 10;
});
}
test().then(result => {
// logs 10
console.log(result);
});
运行时,由于10
处理程序中的return 10
,它会记录.then()
。
.then()
处理程序有四种可能性:
返回常规值,例如return 10
或return val
。该值成为承诺链的已解决值。如果没有返回任何值(在Javascript中表示返回值为undefined
),则承诺链的已解析值为undefined
。
返回最终解决或已经解决的承诺。此承诺已添加到链中,承诺链将采用该承诺的已解决值。
返回最终拒绝或已被拒绝的承诺。此承诺会添加到链中,承诺链会接受退回承诺的拒绝原因。
< / LI> 抛出异常。如果在.then()
处理程序中抛出异常,那么.then()
基础结构将捕获它并将promise链变为拒绝将拒绝原因设置为抛出的值的状态。因此,如果您在throw new Error("User not found")
处理程序中执行.then()
,那么该拒绝链将被拒绝,并将该错误对象作为拒绝原因。
在您的特定代码中:
const doAsyncOp = () =>
$http.get(uri)
.then(
value => value,
reject => //...
);
value => value
没有理由。 value
已经是承诺的已解决价值,您无需再次设置它。
由于胖箭头功能会自动返回任何单个语句,因此您已经在$http.get().then()
函数中从doAsyncOp()
返回了承诺。所以,你可以这样做:
const doAsyncOp = () => $http.get(uri);
doAsyncOp().then(result => {
// handle the result here
}).catch(err => {
// handle error here
});
答案 1 :(得分:1)
要获取客户端代码,只需从函数中返回 promise :
const doAsyncOp = () => $http.get(uri)
然后在您的客户端中,您可以使用:
doAsyncOp()
.then(value => {
// use value
}
.catch(err => { /* error */ }
答案 2 :(得分:0)
我认为您可以使用async并等待解析的值。
function delay(t, v) {
return new Promise(resolve => {
setTimeout(resolve.bind(null, v), t);
});
}
async function(){
await myData = delay(1000, 1000);
console.log(myData);
}