这是我使用的承诺。我还使用了node-mssql软件包。
const loadpictures = () => {
sql.connect(config).then(pool => {
return pool.request()
.query('SELECT Top 20 PhotoURL As src, PostURL As link from Valley_Photos FOR JSON PATH')
}).then((result) => {
//console.dir(result);
sql.close();
return result['result'].typeOf();
}).catch(err => {
console.log(err)
sql.close();
})
}
loadpictures()
.then(result => console.log(results))
.catch( err => ErrorHandler(err) );
我得到的错误是:
TypeError: Cannot read property 'then' of undefined
console.dir输出所需的json对象。我只是不知道如何将其拔出。 我在做什么错了?
答案 0 :(得分:0)
您不会从loadpictures
函数返回任何诺言,因此,您不能在主体中使用then
语句。
返回与async/await
一起使用的第二个承诺很容易:
const loadpictures = async () => {
let pool = await sql.connect(config);
let req = pool
.request()
.query('SELECT Top 20 PhotoURL As src, PostURL As link from Valley_Photos FOR JSON PATH')
req.then((result) => {
//console.dir(result);
sql.close();
return result['result'].typeOf();
}).catch(err => {
console.log(err)
sql.close();
})
return req;
}
loadpictures()
.then(result => console.log(results))
.catch( err => ErrorHandler(err) );
另一方面,仅使用promise更为冗长,因为您必须返回一个新的promise,该promise将以result解析,并以err拒绝:
const loadpictures = () => {
return new Promise((resolve, reject) => {
sql.connect(config).then(pool => {
return pool.request()
.query('SELECT Top 20 PhotoURL As src, PostURL As link from Valley_Photos FOR JSON PATH')
}).then((result) => {
//console.dir(result);
sql.close();
resolve(result)
}).catch(err => {
console.log(err)
sql.close();
reject(err);
})
}
}
loadpictures()
.then(result => console.log(results))
.catch( err => ErrorHandler(err) );
答案 1 :(得分:0)
then
未定义,因为您没有从函数中返回承诺。如果您不需要使用sql.close()
,则可以简单地从函数中返回sql
,因为它可以返回一个promise的函数,但是既然如此,您可以将sql
调用包装在promise中并解决/拒绝结果/错误。
function loadpictures() {
return new Promise((resolve, reject) => {
sql
.connect(config)
.then(pool => {
return pool.request().query(query)
})
.then(result => {
sql.close();
resolve(result['result'].typeOf());
})
.catch(err => {
sql.close();
reject(err);
});
});
}
loadpictures()
.then(result => console.log(result))
.catch(err => ErrorHandler(err));