承诺解决

时间:2018-08-25 16:46:57

标签: javascript web nativescript

我对javascript Promise还是陌生的,我正在使用NativeScript的以下代码查询sqlite数据库,如果行存在则只想返回true,否则想返回false

function hasBookmark(url) {
    (new Sqlite("pakjobs.db")).then(db => {
        db.all("SELECT url FROM bookmarks WHERE url=?", [url]).then(rows => {
            return rows.length ? true : false;
        }, error => {
            console.log("hasBookmark ERROR", error);
            return false;
        });
    }, error => {
        console.log("hasBookmark ERROR", error);
        return false;
    });

    return false;
}

但是函数始终返回false

任何人都可以告诉我如果行存在时如何返回true,否则返回false吗?

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

您将无法返回true或false,这几乎是Promises的重点,您无法在javascript中异步返回某些内容。

但是,您可以直接返回所创建的Promise,然后在其上调用.then

function hasBookmark(url) {
    return (new Sqlite("pakjobs.db")).then(db => {
        return db.all("SELECT url FROM bookmarks WHERE url=?", [url]).then(rows => {
            return rows.length ? true : false;
        }, error => {
            console.log("hasBookmark ERROR", error);
            return false;
        });
    }, error => {
        console.log("hasBookmark ERROR", error);
        return false;
    });

}

const hasBookmarkPromise = hasBookmark('someurl');

hasBookmarPromise.then(value => {
    if (value === true) {
        console.log('has bookmarks');
    }
});

答案 1 :(得分:-2)

function hasBookmark(url) {
    return new Promise((resolve, reject) => {
        (new Sqlite("pakjobs.db")).then(db => {
            db.all("SELECT url FROM          bookmarks WHERE url=?", [url]).then(rows => {
                resolve(rows.length ? true : false)
            }, error => {
                console.log("hasBookmark ERROR", error);
                resolve(false);
            });
        }, error => {
            console.log("hasBookmark ERROR", error);
            resolve(false);
        });
    });
}

hasBookmark(url).then(function(isValid){
   If(isValid){
     // Do something
   }
});