我正在努力学习承诺,并且我有一个我希望改进的承诺链。
在学习如何连接承诺的同时,我不明白为什么有人宁愿回复承诺而不是回报它的价值。
采用以下示例,该示例使用promise chaining:
let myObj = new MyClass();
myObj.getInfo()
.then(result => writeOutput(FILE_NAME, result))
.then(console.log(FILE_NAME + " complete"))
.catch(error => console.error(error));
class MyClass{
getInfo() {
return new Promise(function(fulfil, reject) {
fulfill("I like bananas");
});
}
在这里,我必须连锁2次。但是,如果我直接从方法getInfo()
返回结果而不是返回Promise,我可能会执行以下操作:
let myObj = new MyClass();
let str = myObj.getInfo();
writeOutput(FILE_NAME, str)
.then(console.log(FILE_NAME + " complete"))
.catch(error => console.error(error));
所以你可以看到我有点困惑。
getInfo()
实际上是异步的,是否有可能在我的第二个代码示例中实现类似的代码? 答案 0 :(得分:2)
如果在调用该函数时该值立即可用(在事件循环的同一刻度上),则只能从某个函数返回一个值。请记住,$sqlCheck = "SELECT ActivID, DateRequired, TimeRequired FROM activBooking WHERE ActivID = '$_POST[ActivID]' AND DateRequired = '$_POST[DateRequired]' AND TimeRequired = '$_POST[TimeRequired]'";
$query=mysqli_query($sqlCheck,$con); //$con=your connection setting
$num=mysqli_num_rows($query);
if($num > 0) {
echo "Sorry, this time slot is unavailable for this activity";
} else {
$sql = "INSERT INTO activBooking (CustomerID, ActivID, DateRequired, TimeRequired) VALUES ('$_POST[CustomerID]','$_POST[ActivID]','$_POST[DateRequired]','$_POST[TimeRequired]')";
if($sql){
echo "Data Entered";
}
else{
echo "Problem while entering new data";
}
}
是同步的。
如果它不可用,那么你只能返回一个承诺(或者你可以使用回调,但在这里你特别询问承诺)。
有关更详细的解释,请参阅我之前写的一个问题的答案,询问如何从某个函数返回AJAX调用的结果。我解释了为什么你不能返回价值,但你可以回复一个承诺:
这是另一个相关的答案 - 由于某种原因它被推翻但我认为它解释了一个类似的问题,你问她:
答案 1 :(得分:2)
我不明白为什么有人宁愿回复承诺而不是回报它的价值。
因为你还没有价值。
鉴于
getInfo()
实际上是异步的,是否可以实现与我的第二个代码示例中的代码类似的代码?
如果它是异步的,它必须返回一个承诺。
async
/await
可以实现避免then
调用(但仍使用并生成承诺)的语法:
async function writeInfo(FILE_NAME) {
const myObj = new MyClass();
try {
const str = await myObj.getInfo();
await writeOutput(FILE_NAME, str);
console.log(FILE_NAME + " complete");
} catch (error) {
console.error(error);
}
}
writeInfo("…");
答案 2 :(得分:1)
承诺的目的是说:“数据将在某个时间出现,现在继续编码”,这样您的页面就不会卡住了。基本上你使用Promises来从服务器加载东西。
答案 3 :(得分:1)
另一种看待第一个问题的方式(“为什么会有人......”):
当您在承诺上调用.then
或.catch
时,从调用返回的待处理承诺将附加到现有承诺链的末尾。 (允许“现有链”可能只包含一个承诺)。
当你解决(不是“履行”,你不能履行诺言承诺)承诺的承诺时,解决方案中使用的承诺是插入头部剩下的承诺链。
在调用链中的下一个.then
或.catch
子句之前,解析中使用的承诺必须履行并带有值。