onclick内でPromiseを解決する

ランダバット

私は以下のコードを機能させようとしています。最初の関数(prepareNewCard)はWebページにdivを作成するので、promiseを使用して、divが作成されたときにのみ次の関数(getSearchTerm)が実行されるようにします。getSearchTermは、以前に作成されたdivの検索語で解決することを目的としています。これをテストするために、検索語をconsole.logにしようとしています。ただし、検索語はnullとしてログに記録されますが、関数内のconsole.log( "here")は期待どおりに機能します。.onclickの前に約束が解決されているように見えますが、これがどのように発生するのかわかりません。

これが2つの関数のコードです

function prepareNewCard() {
    //Most of this not relevant to the question, creating the div
    var currentCard = document.createElement("div");
    currentCard.className += " card";
    currentCard.className += " currentCard";
    var currentSearch = document.createElement("input");
    currentSearch.className += " searchInput";
    currentSearch.placeholder += "Enter a search term...";
    var searchButton = document.createElement("button");
    searchButton.className += " searchButton";

    //Create the card to be searched                                                    
    currentCard.appendChild(currentSearch);
    currentCard.appendChild(searchButton);

    //Add this card to the main div                                                     
    const searchResultsArea = document.getElementById("searchResults");

    //The promise being returned
    return new Promise(function(resolve, reject) {
            currentCards = document.getElementById(".currentCard");
            if (currentCards === null) {
                searchResultsArea.appendChild(currentCard);
                resolve(currentCard);
            } else {
                reject('Use your current card before creating a new one');
            }
        });
}

function getSearchTerm(currentCard) {
    currentSearchBar = currentCard.querySelector(".searchInput");
    currentSearchButton = currentCard.querySelector(".searchButton");

    currentSearchButton.onclick = function() {
        return new Promise(function(resolve, reject) {
                var currentSearchInput = currentSearchBar.value;
                if (currentSearchInput !== null) {
                    resolve(currentSearchInput);
                    console.log("here");
                } else {
                    reject("Please input search term");
                }
            });
    }
}

これらの関数を呼び出しているコードはここにあります

    newCardButton.onclick = function() {
        prepareNewCard()
        .then(function(currentCard) {
                getSearchTerm(currentCard)
                .then(function(searchTerm) {
                     console.log(searchTerm)
                })  
                .catch(function(error) {
                    console.log(error)
                });
        })
        .catch(function(error) {
                console.log(error);
        });
    }

これはjavascriptpromiseでは不可能ですか?私はpromise.then関数のいくつかの構成を試しましたが、どれも機能していないようです。前もって感謝します!

編集:

これは約束なしで行われた別のバージョンです。

function prepareNewCard() {
    //Same code above to create div
    const searchResultsArea = document.getElementById("searchResults");
    searchResultsArea.appendChild(currentCard);
    return currentCard;
}

function getSearchTerm(currentCard) {
    currentSearchBar = currentCard.querySelector(".searchInput");
    currentSearchButton = currentCard.querySelector(".searchButton");

    currentSearchButton.onclick = function() {
    console.log("TEST");
    return currentSearchBar.value;
}

    let currentCard;
    let currentSearchTerm;
    newCardButton.onclick = function() {
    currentCard = prepareNewCard();
    currentSearchTerm = getSearchTerm(currentCard);
    console.log(currentSearchTerm);
}

上記のコードのコンソールは次のようになります。

newcardbuttonをクリックすると、console.log(currentSearchTerm)に応答してすぐに「undefined」が表示されます。次に、動的に作成されたdivコンソールでsearchButtonをクリックすると、「TEST」だけが出力されます。

FZ

問題は、onclickハンドラー関数からgetSearchTermではなくハンドラー関数からpromiseを返していることであり、何も返さないため、次のようになります。

function getSearchTerm(currentCard) {
    currentSearchBar = currentCard.querySelector(".searchInput");
    currentSearchButton = currentCard.querySelector(".searchButton");

    return new Promise(function(resolve, reject) {
          currentSearchButton.onclick = function() {
                var currentSearchInput = currentSearchBar.value;
                if (currentSearchInput !== null) {
                    resolve(currentSearchInput);
                    console.log("here");
                } else {
                    reject("Please input search term");
                }
          }
     });
}

また、からpromiseを返すことprepareNewCardは同期的であるため完全に不要です。代わりに、値を返すか、エラーをスローします。

currentCards = document.getElementById(".currentCard");
if (currentCards === null) {
    searchResultsArea.appendChild(currentCard);
    return currentCard;
} else {
    throw 'Use your current card before creating a new one';
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

'executeScript'内でpromiseを解決することは可能ですか?

分類Dev

別の解決済みのPromise内でPromiseを解決できますか?

分類Dev

JavaScriptでPromiseを解決する

分類Dev

javascriptでpromiseを定期的に解決する

分類Dev

解決されたpromise内でObservableを返す

分類Dev

forループ内のpromiseを解決する

分類Dev

forループですべてのpromiseを解決する方法は?

分類Dev

Cloudinaryapi-promiseを解決する

分類Dev

Nodejspromise子が親promiseを解決する

分類Dev

「deletePersonは関数ではありません」をreactjsのonClick内で解決する方法は?

分類Dev

routeproviderで複数のPromiseを解決する

分類Dev

node.jsで可変数のpromiseを解決する方法

分類Dev

typescriptで複数のpromiseを解決する方法

分類Dev

非同期関数でpromiseを解決する方法は?

分類Dev

Angular 2 Promiseを手動で解決する方法は?

分類Dev

Reactルーター4:Routeのrenderメソッド内でpromiseが解決するのを待つ方法は?

分類Dev

Promise内のPromiseの順序を解決します

分類Dev

バッチでpromiseを実行する方法(最初に10を解決し、次に10を解決するなど)

分類Dev

バッチでpromiseを実行する方法(最初に10を解決し、次に10を解決するなど)

分類Dev

axios内の関数のpromiseとスパイを解決する方法

分類Dev

rxjsのreturnオブジェクト内のpromiseを解決する方法

分類Dev

AngularUIルーターでサブ解決する前にpromiseを解決する方法はありますか?

分類Dev

なぜ... ofはPromiseが解決するのを待ち、.forEach()は解決しないのですか?

分類Dev

Promise内のPromiseの解決

分類Dev

関数内のpromiseを解決できません

分類Dev

Javascriptタスク内でApacheANTの変数を解決する方法

分類Dev

別の関数内で$ routeProvider解決関数を使用する

分類Dev

forループのsetTimeout関数内のpromiseを解決します

分類Dev

ExpressJSですべてのPromiseが解決するのを待つ方法は?

Related 関連記事

  1. 1

    'executeScript'内でpromiseを解決することは可能ですか?

  2. 2

    別の解決済みのPromise内でPromiseを解決できますか?

  3. 3

    JavaScriptでPromiseを解決する

  4. 4

    javascriptでpromiseを定期的に解決する

  5. 5

    解決されたpromise内でObservableを返す

  6. 6

    forループ内のpromiseを解決する

  7. 7

    forループですべてのpromiseを解決する方法は?

  8. 8

    Cloudinaryapi-promiseを解決する

  9. 9

    Nodejspromise子が親promiseを解決する

  10. 10

    「deletePersonは関数ではありません」をreactjsのonClick内で解決する方法は?

  11. 11

    routeproviderで複数のPromiseを解決する

  12. 12

    node.jsで可変数のpromiseを解決する方法

  13. 13

    typescriptで複数のpromiseを解決する方法

  14. 14

    非同期関数でpromiseを解決する方法は?

  15. 15

    Angular 2 Promiseを手動で解決する方法は?

  16. 16

    Reactルーター4:Routeのrenderメソッド内でpromiseが解決するのを待つ方法は?

  17. 17

    Promise内のPromiseの順序を解決します

  18. 18

    バッチでpromiseを実行する方法(最初に10を解決し、次に10を解決するなど)

  19. 19

    バッチでpromiseを実行する方法(最初に10を解決し、次に10を解決するなど)

  20. 20

    axios内の関数のpromiseとスパイを解決する方法

  21. 21

    rxjsのreturnオブジェクト内のpromiseを解決する方法

  22. 22

    AngularUIルーターでサブ解決する前にpromiseを解決する方法はありますか?

  23. 23

    なぜ... ofはPromiseが解決するのを待ち、.forEach()は解決しないのですか?

  24. 24

    Promise内のPromiseの解決

  25. 25

    関数内のpromiseを解決できません

  26. 26

    Javascriptタスク内でApacheANTの変数を解決する方法

  27. 27

    別の関数内で$ routeProvider解決関数を使用する

  28. 28

    forループのsetTimeout関数内のpromiseを解決します

  29. 29

    ExpressJSですべてのPromiseが解決するのを待つ方法は?

ホットタグ

アーカイブ