如何实现回调



如何在getValue1函数中实现回调?

现在我变得不确定了?

我需要得到";B";getAll函数中的值

getAll函数需要返回promise,并且不能更改getValue1函数。我该如何做才能有所不同?

function getValue1(callback) {
setTimeout(() => {
callback("B");
}, 10);
}
function getAll() {
return Promise.all([getValue1(b => b)]);
}
getAll().then((arr) => console.log(arr));

创建一个函数来包装对getValue1的调用,使其解析为回调返回的值

const pvalue = () => new Promise(resolve => getValue1(resolve));

注意,这与相同

function pvalue() {
return new Promise(function(resolve) {
getValue1(value => resolve(value));
});
}

所以,值=>解析(值(

是对getValue1-解析pvalue返回的Promise的回调吗

当然还有

getValue1(value => resolve(value));

相当于

getValue1(resolve);

因此,您可以在Promise.all中调用pvalue()而不是getValue1(b=>b)

function getValue1(callback) {
setTimeout(() => {
callback("B");
}, 10);
}
const pvalue = () => new Promise(resolve => getValue1(resolve));
function getAll() {
return Promise.all([pvalue()]);
}
getAll().then((arr) => console.log(arr));

连续传递样式,即"回调";,和Promises是处理异步代码的两种不同的机制。从历史上看,JavaScript和Node使用Function回调,程序员需要遵循某些约定来编写代码。因为很难遵循非强制约定,所以编写回调代码是出了名的容易出错。Promises是一种更新的一流数据结构,它提供了更多专门为处理异步而设计的功能。


如果您编写getValue1,

整个JavaScript社区已经广泛接受了Promises,甚至在语言中添加了更多的功能来利用它们的普遍性。您应该尽可能编写基于Promise的代码。这意味着,如果getValue1的编写者,它不应该进行回调,而是返回promise-

const delay = (ms, value) =>
new Promise(r => setTimeout(r, ms, value))
const getValue1 = _ =>
delay(2000, "B")
getValue1().then(console.log, console.error)
console.log("please wait...")

如果您愿意,您可以使用延续传递样式编写getValue1。Node.js使用一种约定,其中任何错误(如果存在(都将是回调的第一个参数。在Node中,您必须始终检查回调中是否存在错误,否则您可能会在程序中引入错误。为了遵循这个惯例,你的代码看起来像-

const getValue1 = (callback) =>
setTimeout(_ => callback(null, "B"), 2000)
getValue1((err, res) => {
if (err)
console.error("error encountered:", err.message)
else
console.log("result:", res)
})
console.log("please wait...")


如果继承getValue1,

当您继承回调风格的函数时,转换它是有益的,这样您就可以将它与更新的基于Promise的代码一起使用。Node.js有一个内置的函数util.prostify来实现这一点。出于演示目的,我在下面的示例-中包含了我自己的promisify

const promisify = f => (...a) =>              // <- util.promisify
new Promise
( (resolve, reject) =>
f(...a, (e, v) => e ? reject(e) : resolve(v))
)
const getValue1 = (callback) =>               // <- old code
setTimeout(_ => callback(null, "B"), 2000)
const _getValue1 =
promisify(getValue1)                        // <- promisify old code

_getValue1().then(console.log, console.error) // <- back to sanity
console.log("please wait...")


买入承诺

Promises允许您利用新的语言功能,如asyncawait,显著改善代码读写体验-

const sleep = ms =>
new Promise(r => setTimeout(r, ms))
async function getValue1 ()
{ await sleep(1000)
console.log("loading: 25%...")
await sleep(1000)
console.log("loading: 50%...")
await sleep(1000)
console.log("loading: 75%...")
await sleep(1000)
return "B"
}
async function main()
{ console.log("please wait...")
const result = await getValue1()
console.log("done:", result)
}
main().catch(console.error)

please wait...
loading: 25%...
loading: 50%...
loading: 75%...
done: B

最新更新