我读到
async function getVal(){
return await doSomethingAync();
}
var ret = getVal();
console.log(ret);
假设
那么到底是什么情况呢?由async关键字标记的函数是隐式返回承诺,还是我们控制它们返回的内容?
也许如果我们没有显式地返回某个东西,那么他们就会隐式地返回一个允诺。。。?
说得更清楚一点,上面和
function doSomethingAync(charlie) {
return new Promise(function (resolve) {
setTimeout(function () {
resolve(charlie || 'yikes');
}, 100);
})
}
async function getVal(){
var val = await doSomethingAync(); // val is not a promise
console.log(val); // logs 'yikes' or whatever
return val; // but this returns a promise
}
var ret = getVal();
console.log(ret); //logs a promise
在我的概要中,该行为确实与传统的返回语句不一致。当您从
返回值永远是一个承诺。如果您没有显式地返回一个承诺,那么您返回的值将自动包装在一个承诺中。
async function increment(num) {
return num + 1;
}
// Even though you returned a number, the value is
// automatically wrapped in a promise, so we call
// `then` on it to access the returned value.
//
// Logs: 4
increment(3).then(num => console.log(num));
即使没有回报也一样!(返回CodePromise{undefined/code>)
async function increment(num) {}
即使有
function defer(callback) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(callback());
}, 1000);
});
}
async function incrementTwice(num) {
const numPlus1 = await defer(() => num + 1);
return numPlus1 + 1;
}
// Logs: 5
incrementTwice(3).then(num => console.log(num));
承诺自动解包,因此如果您确实从
function defer(callback) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(callback());
}, 1000);
});
}
async function increment(num) {
// It doesn't matter whether you put an `await` here.
return defer(() => num + 1);
}
// Logs: 4
increment(3).then(num => console.log(num));
在我的概要中,该行为确实与传统的返回语句不一致。当您从异步函数显式返回一个非允诺值时,它会强制将其包装在一个允诺中。我对它没有太大的问题,但它确实违抗了正常的JS。
ES6的函数返回的值与
function* foo() {
return 'test';
}
// Logs an object.
console.log(foo());
// Logs 'test'.
console.log(foo().next().value);
我看了一下规范,发现了以下信息。简短的版本是 根据tc39规范,以下是正确的: 除糖至: 其中async function <name>?<argumentlist><body>
function <name>?<argumentlist>{ return spawn(function*() <body>, this); }
function spawn(genF, self) {
return new Promise(function(resolve, reject) {
var gen = genF.call(self);
function step(nextF) {
var next;
try {
next = nextF();
} catch(e) {
// finished with failure, reject the promise
reject(e);
return;
}
if(next.done) {
// finished with success, resolve the promise
resolve(next.value);
return;
}
// not finished, chain off the yielded promise and `step` again
Promise.resolve(next.value).then(function(v) {
step(function() { return gen.next(v); });
}, function(e) {
step(function() { return gen.throw(e); });
});
}
step(function() { return gen.next(undefined); });
});
}
您的问题是:如果我创建一个
假设
async function getVal(){
return await doSomethingAsync();
}
与
async function getVal(){
return doSomethingAsync();
}
你可能在想:“怎么会这样呢?”而且你是对的。如果需要,
更奇怪的是,