Javascript 从节点js中的函数返回承诺
我的代码检查目录中是否存在音频文件。如果没有,则从url下载文件,然后播放Javascript 从节点js中的函数返回承诺,javascript,html,node.js,promise,Javascript,Html,Node.js,Promise,我的代码检查目录中是否存在音频文件。如果没有,则从url下载文件,然后播放 if (condition) { try { if (fs.existsSync(path)) { playaudio(); } else { checkfile().then(function(){ playaudio(); }); } } catch (err){ console.log(err); } } function checkfile () {
if (condition) {
try {
if (fs.existsSync(path)) {
playaudio();
}
else {
checkfile().then(function(){
playaudio();
});
}
}
catch (err){
console.log(err);
}
}
function checkfile () {
try {
if (!fs.existsSync(path)) {
var file = fs.createWriteStream("ring.wav");
var request = http.get("http://mp3.com/ring.wav", function(response) {
response.pipe(file);
});
}
} catch(err) {
console.error(err)
}
}
function playaudio() {
player.play('ring.wav', function(err){
if (err) throw err
})
}
当我运行代码时,它会抛出一个错误:
TypeError:checkfile(…)。then不是函数
如何在此处返回承诺?您需要首先定义一个
承诺
let checkfile = new Promise(function(resolve, reject) {
try {
if (!fs.existsSync(path)) {
var file = fs.createWriteStream("ring.wav");
var request = http.get("http://mp3.com/ring.wav",
function(response) {
response.pipe(file);
resolve("downloaded");
});
}
} catch(err) {
console.error(err)
}
});
现在你可以使用
checkfile.then()....
您需要首先定义一个承诺
let checkfile = new Promise(function(resolve, reject) {
try {
if (!fs.existsSync(path)) {
var file = fs.createWriteStream("ring.wav");
var request = http.get("http://mp3.com/ring.wav",
function(response) {
response.pipe(file);
resolve("downloaded");
});
}
} catch(err) {
console.error(err)
}
});
现在你可以使用
checkfile.then()....
在这里,我试图稍微整理一下代码,使其更易于阅读。正如其他人所说,您需要定义承诺。具体地说,您需要编写一个返回承诺的函数。如果函数返回承诺
,则可以使用。然后
请记住,您还需要确定在成功案例、错误案例或拒绝案例中,承诺解决了什么问题
MDN承诺:
我没有那么多的上下文,所以我有点不清楚在检查文件
函数中,您将解决什么问题
以及您将拒绝什么问题
,但我将尝试在下面给出一个如何使其工作的建议
if (condition) {
try {
if (fs.existsSync(path)) {
playaudio();
} else {
checkfile().then(function(){
playaudio();
});
}
} catch (err) {
console.log(err);
}
}
function checkfile () {
try {
if (!fs.existsSync(path)) {
var file = fs.createWriteStream("ring.wav");
var request = http.get("http://mp3.com/ring.wav", function(response){
response.pipe(file);
});
}
} catch(err) {
console.error(err)
}
}
function playaudio() {
player.play('ring.wav', function(err){
if (err) throw err
})
}
返回承诺及其用法的函数的一般示例:
const somePromiseReturningFunction = function(someParameter) {
return new Promise(function(resolve, reject) {
if (someParameter === 'someDesiredString') {
resolve('Success!');
} else {
reject('Error!');
}
});
};
somePromiseReturningFunction('someDesiredString')
.then(function(resolvedValue) {
console.log(resolvedValue) // prints 'Success!'
})
.catch(function(error) {
console.log(error) // prints 'Error!'
});
重新写入检查文件以返回承诺:
function checkfile () {
return new Promise(function(resolve, reject) {
try {
if (!fs.existsSync(path)) {
var file = fs.createWriteStream("ring.wav");
var request = http.get("http://mp3.com/ring.wav", function(response){
response.pipe(file);
resolve();
});
}
} catch(err) {
reject(err)
}
});
}
在这里,我试图稍微整理一下代码,使其更易于阅读。正如其他人所说,您需要定义承诺。具体地说,您需要编写一个返回承诺的函数。如果函数返回承诺
,则可以使用。然后
请记住,您还需要确定在成功案例、错误案例或拒绝案例中,承诺解决了什么问题
MDN承诺:
我没有那么多的上下文,所以我有点不清楚在检查文件
函数中,您将解决什么问题
以及您将拒绝什么问题
,但我将尝试在下面给出一个如何使其工作的建议
if (condition) {
try {
if (fs.existsSync(path)) {
playaudio();
} else {
checkfile().then(function(){
playaudio();
});
}
} catch (err) {
console.log(err);
}
}
function checkfile () {
try {
if (!fs.existsSync(path)) {
var file = fs.createWriteStream("ring.wav");
var request = http.get("http://mp3.com/ring.wav", function(response){
response.pipe(file);
});
}
} catch(err) {
console.error(err)
}
}
function playaudio() {
player.play('ring.wav', function(err){
if (err) throw err
})
}
返回承诺及其用法的函数的一般示例:
const somePromiseReturningFunction = function(someParameter) {
return new Promise(function(resolve, reject) {
if (someParameter === 'someDesiredString') {
resolve('Success!');
} else {
reject('Error!');
}
});
};
somePromiseReturningFunction('someDesiredString')
.then(function(resolvedValue) {
console.log(resolvedValue) // prints 'Success!'
})
.catch(function(error) {
console.log(error) // prints 'Error!'
});
重新写入检查文件以返回承诺:
function checkfile () {
return new Promise(function(resolve, reject) {
try {
if (!fs.existsSync(path)) {
var file = fs.createWriteStream("ring.wav");
var request = http.get("http://mp3.com/ring.wav", function(response){
response.pipe(file);
resolve();
});
}
} catch(err) {
reject(err)
}
});
}
我没有看到一个允诺人,这个功能运行得很好。但是当我使用.then()时它不起作用,所以我认为它是关于promisesCheck我的答案你删除了你的答案?我看不到promise函数完美地工作。但是当我使用.then()时,它不起作用,所以我认为它是关于promisesCheck我的答案你删除了你的答案?checkfile
不是一个函数。你不能这么说。还有,你从来没有解决过这个承诺。checkfile=newpromise(function(){})
?这意味着checkfile
是一个承诺,而不是一个函数。@mrid你能看看我的问题checkfile
不是一个函数吗。你不能这么说。还有,你永远不会解决承诺。那checkfile=new promise(function(){})
呢?这意味着checkfile
是一个承诺,而不是一个函数。@mrid你能看看我的问题吗?我试试这个,让你知道我试试这个,让你知道吗