代码之家  ›  专栏  ›  技术社区  ›  rahulserver

异步函数等价于承诺

  •  0
  • rahulserver  · 技术社区  · 7 年前

    promise 这样地:

    let aFunction= function(){
        return new Promise((resolve, reject){
           someNodeApi(params, function(err, data)) {
              if(err) {
                return reject(err);
              }
              if(data meets certain criteria) {
                 someOtherNodeApi(params, function(err, data)) {
                    // handle conditions.
                 }
              }
              resolve(data);
           }         
        })
    }
    

    我想要一个 async 函数等价于这类函数。简而言之,我需要这样的东西:

    let aFunction = async function(){
       someNodeApi(params, function(err, data){
          if(err) {
              // reject condition
          }
          // resolve condition.
       })
    }
    

    reject resolve 条件,以便我调用函数的所有位置如下所示:

    aFunction()
      .then(data=>{})
      .catch(err=>{})
    

    应该保持不变。

    . 但问题在于如何转换一个函数,该函数返回一个承诺,即能够使用async Wait模式的优点,而无需修改其调用方式(在处理预异步wait era节点(js代码)时,这是一个非常常见的场景。

    3 回复  |  直到 7 年前
        1
  •  2
  •   squeekyDave    7 年前

    这就是我喜欢的写作方式 异步/等待 编辑 :await仅在API返回已解析或已拒绝的承诺对象时才起作用。 不解决承诺。

    function someAPI() {
        return new Promise((resolve, reject)=>{
          someNodeApi(params, function(err, data){
                if(err) {
                    reject(error)
                } else {
                  resolve(data)
                }
                // resolve condition.
            })
        });
      }
    
    
    async function aFunction() {
      try {
        const result = await someAPI();
        return result;
      } catch(err){
        console.log(err);
      }
    }
    
    aFunction()
    .then((res) => console.log(res))
    
        2
  •  1
  •   Matt Way    7 年前

    当更改为async/await时,更改的不是承诺设置,而是如何调用承诺。例如:

    aFunction()
      .then(data=>{})
      .catch(err=>{})
    
    // becomes
    try{
      const data = await aFunction()
    }catch(err){
      // do something with err
    }
    

    请记住,函数 使用 等待需要设置为 async .


    如果你的 someNodeApi 已经为承诺设置了调用,然后结果仍然完全相同,您根本不需要 aFunction 完全例如,如果您在api上使用了Promising库,那么您不需要 完全

    someNodeApi(params)
      .then(data => {})
      .catch(err => {})
    
    // or
    
    const data = await someNodeApi(params)
    if(data meets certain criteria) {
       const otherData = someOtherNodeApi(params)
    }
    
        3
  •  1
  •   Kruthika C S    7 年前

    代码片段1:在这里,您可以看到AsyncWait的用法

    let fn = async function(a) {
    	let val = 10;
    	return new Promise((resolve, reject) => {
    		if(a > val) {
    			resolve("+++++Resolved");
    		}
    		else {
    			reject("++++++Rejected")
    		}
    	})
    };
    
    (async () => {
    	try {
    		let result1 = await fn(20);
    		console.log(result1);
    
    		let result2 = await fn(5);
    		console.log(result2);
    	}
    	catch(err) {
    		console.error(err);
    	}
        
    })();

    代码段2:在这里,您可以看到使用.then.catch不会损害或破坏您的任何代码。

    let fn = async function(a) {
    	let val = 10;
    	return new Promise((resolve, reject) => {
    		if(a > val) {
    			resolve("+++++Resolved");
    		}
    		else {
    			reject("++++++Rejected")
    		}
    	})
    };
    
    fn(20).then(response => {
    	console.log(response);
    });
    
    fn(5)
    	.then(response => {
    		console.log(response);
    	})
    	.catch(err => {
    		console.error(err);
    	})

    如果使用fn().then.catch模式返回异步函数,则不会破坏代码。
    然而,使用wait会使它更加优雅。

    这里的缺点是: https://github.com/cskru/asyncAwaitSimplified

    我已经包括了代码片段,您可以直接复制粘贴并试用。

    PS:我在上面的代码片段中使用了异步IIFE。

    我还建议你检查一下这个 article 等待一个坚实的基础WRT。

    学习愉快!

    干杯
    克鲁西卡

    推荐文章