2017-10-17 79 views
0
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()可以异步工作?

注意:我必须只在同一个函数中执行任务。

+0

嗯,没有任何意义对于这一点,我无法理解....尝试看看rx.js –

+0

但不想使用observable..can我没有兑现承诺吗? – Aditya

+0

你必须负责你的应用程序的状态。代表这不是一个上帝的想法 –

回答

0

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

的原因。

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

async function被调用时,它返回一个Promise,如果省略从async functionasync关键字,你应该返回一个承诺对象,而不是。例如:

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

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

如果在上面打电话main(),你会在控制台得到消息“你好”。

the await expression can only be used inside an async function。所以如果你在“异步”功能中省略了async关键字,你应该自己处理“Promise”。

根据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(); 
     } 
    } 
}