JavaScript,Promises与回调共存

时间:2016-01-04 05:25:31

标签: javascript callback

如何改进下面的第三个功能,使用基于回调和基于Promises的函数的两个函数?

第一个函数是“times 2”的标准回调实现。

function a(i, cb) {
  return cb(null, i * 2);
}

let ans = 
  a(2,
    function(error, result) {
      if (error) console.log('a callback error ' + error.message);
      return result;
    }
  );
console.log('a(2, cb)=' + ans);

它到达

a(2, cb)=4

我的第二个函数使用Promises作为“时间3”。

function ap(i) {
  return new Promise(function(resolve, reject) {
    return resolve(i * 3); 
  })
}

ap(2)
.then(function(result, error) {
  if (error) console.log('error ' + error.message);
  console.log('ap(2)=' + result);
});

它到达

ap(2)=6

这个问题的动机是一段代码,我似乎无法按正确的顺序发表声明。我正在尝试使用第三个函数来学习如何使回调函数与Promises函数共存。第一次尝试调用上面的回调函数,然后链接上面的Promise函数。

let ans;
function aap(i) {
  let answer = a(i, function(error, result) {
    if (error) console.log('error ' + error.message);
    return result;
  });
  ap(answer)
  .then(function(result, error) {
    console.log('aap ap callback   result=' + result + '   error=' + error);
    if (error) console.log('error ' + error.message);
    ans = result;
  })
}

aap(2);
console.log('aap(2)=' + ans);

它到达了两个

aap(2)=null
aap ap callback   result=12   error=undefined

第一行看起来像是失败。我从第二行看到,如果我能更有效地控制语句顺序,那么正确的答案是可用的。怎么最好?

2 个答案:

答案 0 :(得分:1)

尝试将error处理分离到.then()的第二个参数,从ap返回aap,将ans设为let ans = aap(2)



function a(i, cb) {
  return cb(null, i * 2);
}

function ap(i) {
  return Promise.resolve(i * 3);
}

function aap(i) {
  let answer = a(i, function(error, result) {
    if (error) console.log("error " + error.message);
    return result;
  });
  return ap(answer)
    .then(function(result, error) {
      console.log("aap ap callback   result=" + result);
      return result;
    }, function(e) {
      if (e) console.log("e " + e.message);
      return e
    })
}

let ans = aap(2);

ans.then(function(res) {
  console.log(res);
  return res
}, function err(e) {
  console.log(e)
});

console.log(ans);




答案 1 :(得分:0)

@ guest271314很好地回答了这个问题。此外,他们为我提供了创建后续问题的有用答案所需的工具。我的原帖明确暗示了后续问题;它会要求创建函数apa(i)的技术(首先调用ap()并将其链接到()(与上面提到的问题相反)。

这是我得到的

function apa(i) {
  ap(i)
  .then(function(result, error) {
    if (error) console.log('error ' + error.message)
    else return a(result, function(error2, result2) {
      if (error2) console.log('error ' + error2.message)
      else console.log('apa(' + i + ')=' + result2);
    });
  });
}

apa(2);

它到达

apa(2)=12

如果有人关心在异步环境中使用Promises发布回调和函数的更好的技术,我很乐意阅读它。通过演示,我得出结论可以做到。