如何使同步任务成为异步?

时间:2017-10-17 10:33:02

标签: javascript typescript

class some{   
let result;

 function asyn addition(){
    if (this.result != 'addition'){   //synchronous
        return this.result;
    }
    else
    result = await do some asynchronous task;   // asynchronous promise using some third party lib.
    return result;
    }
    }
}

问题1 :我们可以在asyn函数中实现sybschronous代码吗?

问题2:如何将同步作为异步任务,以便add()可以异步工作?

注意:我必须在同一个功能中完成任务。

1 个答案:

答案 0 :(得分:0)

  

问题1:我们可以在asyn函数中实现sybschronous代码吗?

原因。

  

问题2:如何将同步作为异步任务,以便add()可以异步工作?

当调用async function时,它会返回Promise,如果忽略async中的async function关键字,则应返回Promise对象。例如:

/* async */ function async_fn() {
    return Promise.resolve('hello');
}

async function main() {
    let msg = await async_fn();
    console.log(msg);
}

如果您拨打上面的main(),您将在控制台中收到“hello”消息。

await表达式can only be used inside an async function。因此,如果在“异步”函数中省略async关键字,则应自行处理“承诺”。

根据https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

  

当调用异步函数时,它返回一个Promise。当异步时   函数返回一个值,Promise将被解析   返回值。当异步函数抛出异常或某些异常时   价值,承诺将以抛出的价值被拒绝。

所以你的代码在技术上等于:

function async_function() {
    return Promise.resolve('hello world');
}

class some {
    result;

    addition() {
        if (this.result != 'addition') {   //synchronous
            return Promise.resolve(this.result);
        } else {
            return new Promise(function (resolve, reject) {
                async_function().then(function (result) {
                    resolve(result); // Promise resolve here (normal return)
                }).catch(function (err) {
                    reject(err); // Promise reject (throw error)
                });
            });
        }
    }
}

并且因为async_function()的返回类型也是Promise,如果您不打算在方法result中操纵其addition(),则可以使此函数更简单:

class some {
    result;

    addition() {
        if (this.result != 'addition') {   //synchronous
            return Promise.resolve(this.result);
        } else {
            return async_function();
        }
    }
}