Javascript 从节点js中的函数返回承诺

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 () {

我的代码检查目录中是否存在音频文件。如果没有,则从url下载文件,然后播放

    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你能看看我的问题吗?我试试这个,让你知道我试试这个,让你知道吗