使用go和Otto调用javascript回调函数

时间:2017-01-06 07:29:50

标签: javascript go

如何使用Otto调用作为参数传递的javascript函数(作为回调函数)?

示例javascript:

<!DOCTYPE html>
<html lang="en">
<head>
        <?php 

        // USED TO DEBUG WHY HTTPS WAS NOT WORKING IN THE BEGINNING
        // var_dump(stream_get_wrappers()); 

        ?>


        <?php 

            // REQUIRE TWITTEROAUTH LIBRARY
            require "twitteroauth/autoload.php";

            // I HAVE HACKED AROUND WITH THIS, BUT DON'T SEE WHY ABRAHAM IS NECESSARY SINCE THERE IS NO FOLDER NAMED ABRAHAM,
            // BUT CODE DOES NOT WORK WITHOUT THIS, SO LEAVE IT IN!  :)
            use Abraham\TwitterOAuth\TwitterOAuth;

            // DECLARE VARIABLES OF KEYS, SECRET, TOKEN, & TOKEN_SECRET
            $CONSUMER_KEY = "12345";
            $CONSUMER_SECRET = "12345";
            $access_token = "12345";
            $access_token_secret = "12345"

            // DEFINE NEW CONNECTION VARIABLE: I.E. CONNECTION TO TWITTER VIA TWITTEROAUTH
            $connection = new TwitterOAuth($CONSUMER_KEY, $CONSUMER_SECRET, $access_token, $access_token_secret);

            // CREATE MULTIPLE-PARAMETER QUERY AS ARRAY
            $query = array(
              "q" => "#MickeyMouse",
              "count" => "1000",
              "include_entities" => "true"
            );

            // MAKE CONNECTION TO TWITTER, GET METHOD FOR "SEARCH/TWEETS", PASS ARRAY AS QUERY
            $result = $connection->get("search/tweets", $query);

            // TEST OUTPUT FOR DEBUGGING
            //var_dump($result);

            // CREATE VARIABLES:  NEW EMPTY ARRAYS
            $ArrayPhotoURLs = array();      

            // FOR LOOP,  
            foreach ($result->statuses as $content) {

                // IF EACH TWEET/STATUS HAS MEDIA,
                if (isset($content->entities->media)) {

                    // THEN GET THOSE MEDIA URLS
                    foreach ($content->entities->media as $media) {
                        $media_url = $media->media_url; // Or $media->media_url_https for the SSL version.

                        // AND ASSIGN/APPEND EACH MEDIA URL TO THE ARRAY OF MEDIA URLs
                        $ArrayPhotoURLs[] = $media_url; 

                        // TEST OUTPUT FOR DEBUGGING
                        //print(gettype($media_url));
                        //print_r($media_url);
                        //var_dump($media_url);
                    }

                }

            }

            // TEST OUTPUT FOR DEBUGGING
            //var_dump($ArrayPhotoURLs);

            // COUNT IMAGES IN ARRAY OF TWITTER IMAGE URLS - TO BE USED BELOW TO CREATE DYNAMIC LIST / ANCHOR / IMG ITEMS
            $imagecount = count($ArrayPhotoURLs); 

            // TEST OUTPUT FOR DEBUGGING
            echo $imagecount;
        ?>

</head>

<?php // HTML LAYOUT CODE BEGINS HERE ?>
<body style="">
    <div class="container">

        <div>
                <?php 
                    // FOR LOOP, PRINT HTML WITH URL AS BOTH A HREF & IMG SRC PARAMETERS & ANCHOR TEXT
                    foreach ($ArrayPhotoURLs as $PhotoURL) {

                        echo '<a href="',    $PhotoURL    ,'">',
                        '<img src="',$PhotoURL, '">', $PhotoURL,
                        '</img></a><br/>';
                    }
                ?>          
        </div>

    </div>
</body>
</html>

示例使用Otto代码:

yVals.add(new BarEntry(LocalTeam.getRedCard(),"Rojas"),1 *2f);

1 个答案:

答案 0 :(得分:0)

是的,这是可能的,虽然此时我只用包裹在对象中的回调来完成它。所以你的代码看起来像这样:

func main() {
    motto.AddModule("test", testModuleLoader)
    vm := motto.New()
    vm.Run("test.js")
}

func testModuleLoader(vm *motto.Motto) (otto.Value, error) {
    test, _ := vm.Object(`({})`)
    test.Set("testCallback", func(call otto.FunctionCall) otto.Value {
        fnWrapper := call.Argument(0).Object()

        // HOW TO CALL fn("value for a") ?
        cb, _ := fnWrapper.Get("cb")
        if cb.IsFunction() {
          cbArgs := "value for a"
          return fnWrapper.Call("cb", cbArgs) // cbArgs is optional
        }

        return motto.NullValue()
    })

    return vm.ToValue(test)
}