비동기/비동기가 암묵적으로 약속을 반환합니까?
▁byc▁marked다▁functions▁i는▁asyn 표시된 비동기 함수를 .async키워드는 암시적으로 약속을 반환합니다.
async function getVal(){
return await doSomethingAync();
}
var ret = getVal();
console.log(ret);
은 일관성이 ...doSomethingAsync()약속을 반환하고 wait 키워드는 약속 자체가 아닌 약속의 값을 반환합니다. 그러면 my getVal 함수는 암묵적인 약속이 아닌 해당 값을 반환해야 합니다.
그렇다면 정확히 어떤 경우일까요?비동기 키워드로 표시된 함수는 암묵적으로 약속을 반환합니까, 아니면 우리가 그들이 반환하는 것을 제어합니까?
만약 우리가 무언가를 명시적으로 돌려주지 않는다면, 그들은 암묵적으로 약속을 돌려줄 것입니다...?
좀 더 명확하게 말하면, 위와 위의 것 사이에는 차이점이 있습니다.
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기능, 그것은 약속으로 그것을 강제로 포장할 것입니다.저는 그것에 큰 문제는 없지만, 그것은 일반적인 JS를 거스릅니다.
반환 값은 항상 약속입니다.명시적으로 약속을 반환하지 않으면 반환되는 값이 자동으로 약속으로 포장됩니다.
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));
거Promise { undefined }
async function increment(num) {}
같은 것이 있다 하더라도.await.
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));
해제를 약속합니다. 만약 이 동포해 약다니속 한다면. 따라서 만약 당신이 그 안에서 값에 대한 약속을 반환한다면.async함수, 값에 대한 약속을 받게 됩니다(값에 대한 약속이 아님).
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와 를 가지고 .return이러한 함수를 생성기라고 합니다.
function* foo() {
return 'test';
}
// Logs an object.
console.log(foo());
// Logs 'test'.
console.log(foo().next().value);
예, 비동기 함수는 항상 약속을 반환합니다.
tc39 사양에 따르면,async function를 .Promises의
구체적으로:
async function <name>?<argumentlist><body>
데슈가 대상:
function <name>?<argumentlist>{ return spawn(function*() <body>, this); }
에▁where디spawn는 다음 " 다음알고대에호한다니입출즘리"
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함수는 약속을 반환해야 합니까, 아닌가요?답변: 원하는 대로 하면 Javascript가 해결해 줍니다.
가정하다doSomethingAsync약속을 돌려주는 함수입니다. 그러면.
async function getVal(){
return await doSomethingAsync();
}
와 정확히 같습니다.
async function getVal(){
return doSomethingAsync();
}
여러분은 아마도 "WTF, 어떻게 이것들이 같을 수 있나요?"라고 생각하고 있을 것입니다. 그리고 여러분은 맞습니다.async필요한 경우 약속으로 값을 마법처럼 감쌉니다.
더 이상한 것은,doSomethingAsync어떤 때는 약속을 돌려주고 어떤 때는 약속을 돌려주지 않기 위해 쓰여질 수 있습니다.여전히 두 기능은 정확히 동일합니다, 왜냐하면await마법이기도 합니다.필요한 경우 약속을 해제하지만 약속이 아닌 항목에는 영향을 주지 않습니다.
호출할 때 함수 앞에 대기를 추가하면 됩니다.
var ret = await getVal();
console.log(ret);
비동기는 약속을 반환하지 않습니다. wait 키워드는 약속의 해결을 기다립니다.비동기는 향상된 발전기 기능이며 수율과 약간 유사한 작업을 기다립니다.
구문(100% 확신할 수 없음)은
async function* getVal() {...}
ES2016 제너레이터 기능은 이와 같이 작동합니다.나는 당신이 이렇게 프로그래밍하는 지루함 위에 데이터베이스 핸들러를 만들었습니다.
db.exec(function*(connection) {
if (params.passwd1 === '') {
let sql = 'UPDATE People SET UserName = @username WHERE ClinicianID = @clinicianid';
let request = connection.request(sql);
request.addParameter('username',db.TYPES.VarChar,params.username);
request.addParameter('clinicianid',db.TYPES.Int,uid);
yield connection.execSql();
} else {
if (!/^\S{4,}$/.test(params.passwd1)) {
response.end(JSON.stringify(
{status: false, passwd1: false,passwd2: true}
));
return;
}
let request = connection.request('SetPassword');
request.addParameter('userID',db.TYPES.Int,uid);
request.addParameter('username',db.TYPES.NVarChar,params.username);
request.addParameter('password',db.TYPES.VarChar,params.passwd1);
yield connection.callProcedure();
}
response.end(JSON.stringify({status: true}));
}).catch(err => {
logger('database',err.message);
response.end(JSON.stringify({status: false,passwd1: false,passwd2: false}));
});
내가 어떻게 그것을 그냥 보통 동기식으로 프로그래밍하는지 주목하세요. 특히.
yield connection.execSql그리고yield connection.callProcedure
db.exec 함수는 상당히 일반적인 Promise 기반 생성기입니다.
exec(generator) {
var self = this;
var it;
return new Promise((accept,reject) => {
var myConnection;
var onResult = lastPromiseResult => {
var obj = it.next(lastPromiseResult);
if (!obj.done) {
obj.value.then(onResult,reject);
} else {
if (myConnection) {
myConnection.release();
}
accept(obj.value);
}
};
self._connection().then(connection => {
myConnection = connection;
it = generator(connection); //This passes it into the generator
onResult(); //starts the generator
}).catch(error => {
reject(error);
});
});
}
언급URL : https://stackoverflow.com/questions/35302431/async-await-implicitly-returns-promise
'programing' 카테고리의 다른 글
| 노드의 JavaScript OOPJS: 어떻게? (0) | 2023.07.27 |
|---|---|
| AJAX 호출에서 302가 따르지 않습니다. (0) | 2023.07.27 |
| 머리글을 별도의 디렉토리에 배치해야 하는 이유는 무엇입니까? (0) | 2023.07.27 |
| Oracle -max_string_size가 표준인지 확장되었는지 확인하는 방법 (0) | 2023.07.27 |
| Python 설정 도구를 사용한 설치 후 스크립트 (0) | 2023.07.22 |