Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node js,为什么我的函数不是函数?_Javascript_Node.js - Fatal编程技术网

Javascript Node js,为什么我的函数不是函数?

Javascript Node js,为什么我的函数不是函数?,javascript,node.js,Javascript,Node.js,我试图构建一个后端脚本来调用recurly api来加载数据并存储它。我声明该函数并将其分配给getAccountInfo,之后我尝试调用该函数,但控制台显示getAccountInfo不是函数。。 还有console.log(accountInfo)显示未定义。但我可以在函数声明中看到它 api参数需要回调函数,这就是它看起来像这样的原因 var accountInfo = {}; let getAccountInfo = recurly.accounts.list(function (e

我试图构建一个后端脚本来调用recurly api来加载数据并存储它。我声明该函数并将其分配给getAccountInfo,之后我尝试调用该函数,但控制台显示getAccountInfo不是函数。。 还有console.log(accountInfo)显示未定义。但我可以在函数声明中看到它

api参数需要回调函数,这就是它看起来像这样的原因

var accountInfo = {};


let getAccountInfo = recurly.accounts.list(function (errResponse, response) {
    if (errResponse) {
        reject(errResponse);
    }
    if (response) {
        accountInfo = response.data.accounts.account;
        resolve(response);      
    }
}, );

getAccountInfo();
console.log(accountInfo);

我希望我可以运行该函数并获取accountInfo。我不熟悉javascript和NodeJS,这是我误解的概念吗?非常感谢您的帮助。

getAccountInfo
是递归的
accounts.list()
返回的内容,它不是一个函数(因为它是一个异步函数,所以可能不会返回任何内容,或者可能会返回一个承诺)。您需要自己定义一个函数:

function getAccountInfo() {
  recurly.accounts.list(function(errResponse, response) {
    if (errResponse) {
      reject(errResponse);
    }
    if (response) {
      accountInfo = response.data.accounts.account;
      resolve(response);
    }
  });
}
请注意,
console.log(accountInfo)
不会打印结果,因为该函数是异步的。有关构造代码以便使用结果的正确方法,请参阅

我声明函数并将其分配给getAccountInfo

不,你不是那样做的。您重新调用了函数recurly.accounts.list(),并将getAccountInfo设置为它返回的值。由于它是一个异步函数,它可能几乎立即返回,很有可能没有返回任何内容,并且getAccountInfo设置为undefined

此外,在代码中未定义拒绝和解析。我会这样做的

function getAccountInfo() {
    return new Promise((resolve, reject) => {
        recurly.accounts.list((errResponse, response) => {
            if (errResponse) {
                return reject(errResponse);
            }

            resolve(response);      
        }, );
    });
}
当您调用getAccountInfo()时,它会返回一个承诺,因此您必须等待它得到解决

getAccountInfo()
    .then(response => {
        accountInfo = response.data.accounts.account;
        console.log(accountInfo);
    })
    .catch(err => console.log(err));

链接到
recury.accounts.list()
的文档可能会有所帮助。它起作用了!我要学习更多关于承诺的知识。非常感谢。先生,我还有一个问题,那么accountInfo只在范围内可用吗?如果我想将accountInfo保存到外部作用域,以便其他函数都可以访问它,该怎么办?您可以将accountInfo分配给作用域之外的变量,我的大脑不会允许我这样做。:-)但是,请记住,外部脚本已经完成,因此必须从then块中使用accountInfo。通常,您调用另一个函数,该函数执行任何工作。您可以将accountInfo分配给全局变量或传递给其他函数。我有过线程安全编码的经历,所以我总是到处传递东西,从不使用globals。